【问题标题】:How to run gunicorn on a file in directory?如何在目录中的文件上运行 gunicorn?
【发布时间】:2020-01-16 12:54:17
【问题描述】:
我有一个使用应用程序工厂的烧瓶应用程序,我可以以 gunicorn "run:create_app()" 的身份运行 gunicorn 并且工作正常。
但是,我想从它的父目录运行它,例如 gunicorn "application.run:create_app" 或 gunicorn "application/run:create_app"
没有 --chdir 怎么办?
【问题讨论】:
标签:
python
flask
gunicorn
【解决方案1】:
您已经列出了应该工作的模式——该参数是一个 python 模块的full dotted path,加上来自该模块的一个变量,它是一个应用程序对象。因此,如果我们有一个包含内容的文件 parent_dir/myproject/uwsgi.py
from application import create_app
app = create_app()
我们可以像运行 gunicorn 一样
# From myproject
gunicorn uwsgi:app
# from parent_dir
gunicorn myproject.uwsgi:app
现在,我怀疑您看到的问题是,虚线路径表示法要求父目录是 python 包 - 这意味着您需要在 myproject.xml 中有一个 __init__.py 文件。否则解释器将不会在该文件夹中查找 python 文件以使其可导入。
Python 将查看其 PYTHONPATH 上的任何目录。从那里开始,任何模块都将是顶级的,任何带有__init__.py 文件的目录都将是包。默认行为是将当前目录添加到 PYTHONPATH 变量中。所以具有以下结构
foldera
packagea
__init__.py
modulea.py
folderb
packageb
__init__.py
moduleb.py
folderc
packagec
modulec.py
对于foldera,您可以使用import packagea.modulea,但不能使用import packageb.moduleb。从文件夹packagea 你可以做import modulea 但不是import packagea.modulea(包不在路径上!)。从folderc 你不能导入任何这些模块——PYTHONPATH 上没有任何包或模块。如果您确实设置了export PYTHONPATH=foldera:folderb:folderc:$PYTHONPATH,则可以导入packagea.modulea 和packageb.moduleb。如果没有完整的虚线路径,您仍然无法导入 modulec 或 modulea 或 moduleb。