У меня есть существующее приложение Flask под названием myapp, которое компилируется с помощью pyinstaller
Когда я запускаю gunicorn с myapp, выдается следующая ошибка
$ gunicorn myapp:app
[2019-04-02 22:08:16 +0000] [478] [INFO] Starting gunicorn 19.9.0
[2019-04-02 22:08:16 +0000] [478] [INFO] Listening at: http://127.0.0.1:8000 (478)
[2019-04-02 22:08:16 +0000] [478] [INFO] Using worker: sync
[2019-04-02 22:08:16 +0000] [481] [INFO] Booting worker with pid: 481
[2019-04-02 22:08:16 +0000] [481] [ERROR] Exception in worker process
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/gunicorn/arbiter.py", line 583, in spawn_worker
worker.init_process()
File "/usr/local/lib/python3.5/dist-packages/gunicorn/workers/base.py", line 129, in init_process
self.load_wsgi()
File "/usr/local/lib/python3.5/dist-packages/gunicorn/workers/base.py", line 138, in load_wsgi
self.wsgi = self.app.wsgi()
File "/usr/local/lib/python3.5/dist-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/usr/local/lib/python3.5/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load
return self.load_wsgiapp()
File "/usr/local/lib/python3.5/dist-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
return util.import_app(self.app_uri)
File "/usr/local/lib/python3.5/dist-packages/gunicorn/util.py", line 350, in import_app
__import__(module)
ImportError: No module named 'myapp' <===============
[2019-04-02 22:08:16 +0000] [481] [INFO] Worker exiting (pid: 481)
[2019-04-02 22:08:16 +0000] [478] [INFO] Shutting down: Master
[2019-04-02 22:08:16 +0000] [478] [INFO] Reason: Worker failed to boot.
myapp создается путем статического связывания несколькихФайлы Python
a = Analysis(['c.py', 'd.py', 'e.py', 'f.py', 'g.py', 'main.py'],
pathex=['/src/myapp'],
binaries=[],
datas=[],
hiddenimports=['configparser'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='myapp',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
myapp прекрасно работает для меня с точки зрения автономного сервера Flask.Теперь мне нужно перейти на gunicorn + Flask, чтобы избавиться от ограничений Flask (обратите внимание, что myapp вызывается только из другой внутренней службы, и мне не нужны веб-страницы доступа / nginx / html и т. Д., Только для обслуживания вызовов Rest)myapp)
Вот как выглядит main.py
app = Flask(__name__)
...
def runServer(args):
app.logger.info('Starting myapp service')
app.run('0.0.0.0', port=args.port) <=============
...
def main():
rv = 0 # Always return 0 by default
args = parse_args()
if args.which == 'server':
runServer(args)
.....
if __name__ == '__main__':
sys.exit(main())
Когда я запускаю команду gunicorn внутри моего каталога сборки следующим образом, она отлично работает
$ gunicorn main:app
[2019-04-02 22:30:55 +0000] [482] [INFO] Starting gunicorn 19.9.0
[2019-04-02 22:30:55 +0000] [482] [INFO] Listening at: http://127.0.0.1:8000 (482)
[2019-04-02 22:30:55 +0000] [482] [INFO] Using worker: sync
[2019-04-02 22:30:55 +0000] [485] [INFO] Booting worker with pid: 485
Но я хочу, чтобы он запускался там, где я устанавливаю myapp, а не из каталога сборки