【发布时间】:2021-11-09 11:57:09
【问题描述】:
按照tutorial dockerize Flask 堆栈,我正在尝试从外部 manage.py 文件启动现有应用程序
我的应用结构如下:
└── services
└── web
├── manage.py
└── myapp
└── requirements.txt
└── myserver
└──__init__.py
└──config
└──config.py
manage.py 文件:
import os
os.chdir('myapp')
from flask.cli import FlaskGroup
from myapp.myserver import create_app
app = create_app()
cli = FlaskGroup(app)
if __name__ == "__main__":
cli()
最后,myapp/myserver/__init__.py 文件(简化):
from myserver.config.config import Config # this file exists and imports work when i launch from pycharm
def create_app():
app = Flask(__name__)
...other stuff here
return app
所以当我尝试运行:python3 manage.py run 时,输出为:
File "manage.py", line 4, in <module>
from myapp.myserver import create_app
File "/var/www/html/flask-docker/services/web/myapp/myserver/__init__.py", line 12, in <module>
from myserver.config.config import Config
无法解析来自__init__.py 的配置导入。我试图用 manage.py 中可见的 chdir 来解决这个问题。
我的环境变量是我从工作 Pycharm 烧瓶设置中得到的:
FLASK_APP="myserver:create_app()"
我通过替换成功地通过了导入指令:
from myserver.config.config import Config
通过
from .config.config import Config
但整个项目包含以 from myserver
开头的导入所以最后一个问题是:为什么 myserver 中的 init 文件无法识别 myserver 文件夹/模块?当我通过 PyCharm 启动它时,这个设置工作得很好
【问题讨论】:
-
我不知道我是否完全遵循您的问题,但是像您一样,相对导入要记住的一点是路径会根据您的工作目录而变化。因此,在一个目录中工作的导入不会在另一个目录中工作。所以一定要相对于 docker 正在运行的任何目录导入。
-
@BrandonKauffman 不会
os.chdir帮忙吗? -
实际上没有。我希望我有一个很好的答案,但我可以只是代码不能与解释器一起工作。 stackoverflow.com/questions/23619595/…
-
我已经发布了我的答案,引用了这个完全相同的帖子。谢谢你:)
标签: python python-3.x flask python-import