PyCharm如何处理模块的相对导入?

6

我有一个继承来的项目,目录结构如下:

work_dir/
    FlaskControlPanel/
        static/
        templates/
        app.py
    models/
        __init__.py
        model1.py
        model2.py
    script1.py
    script2.py

从`script1.py`或`script2.py`中,我可以使用`from models.model1 import Class1, Class2`这一行代码,并且代码可以正常工作。但是,在使用PyCharm时,我在`app.py`中仍然可以使用相同的导入语句。
然而,在我尝试将其部署到开发服务器上时,从`app.py`中导入该模块就会失败。我会收到错误信息:`ImportError: No module named models.model1`。
PyCharm是如何解决这个问题的?
我该如何修复在`app.py`中的导入问题,在PyCharm和我在开发服务器上运行Flask应用程序时都能正常工作? 我通常会在`FlaskControlPanel`目录下运行`python app.py`。
1个回答

4
你需要确保将 work_dir 添加到 sys.path 或 PYTHONPATH 中。Python 会自动将脚本文件的父级目录添加到 sys.path 中。因此,如果在 shell 中运行 app.py,则只会插入 FlaskControlPanel 到 sys.path,而且 Python 找不到 models 的位置(work_dir 没有在 sys.path 中)。但是,在 PyCharm 中,它会始终将 work_dir 添加到 sys.path 中。这就是为什么你可以毫无问题地运行 app.py。对于你的问题,你可以切换到 work_dir 目录并运行 PYTHONPATH=. python FlaskControlPanel/app.py。完整说明文档请参考:https://docs.python.org/2/using/cmdline.html#interface-options

1
你的意思是“只有FlaskControlPanel会被插入到sys.path中,而python找不到models所在的位置。” - Leo5188

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接