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

New*_*Guy 6 python python-import pycharm flask

我在继承的项目上有以下目录结构:

work_dir/
    FlaskControlPanel/
        static/
        templates/
        app.py
    models/
        __init__.py
        model1.py
        model2.py
    script1.py
    script2.py
Run Code Online (Sandbox Code Playgroud)

From script1.pyor script2.pyI can run this from models.model1 import Class1, Class2and it works。使用 PyCharm 时,我可以在app.py.

但是,当我在我的开发服务器上部署它时,这在app.py. 我收到错误ImportError: No module named models.model1

PyCharm 做了什么来解决这个问题?

app.py当我在开发服务器上运行 Flask 应用程序时,如何修复我的导入以在 PyCharm 中工作?我通常只python app.pyFlaskControlPanel目录中使用它在服务器上运行它。

hoo*_*ecn 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

执行脚本中包含的 Python 代码,该代码必须是引用 Python 文件、包含 __main__.py 文件的目录或包含 __main__.py 文件的 zip 文件的文件系统路径(绝对或相对)。

如果给出此选项,sys.argv 的第一个元素将是命令行上给出的脚本名称。

如果脚本名称直接引用 Python 文件,则包含该文件的目录将添加到 sys.path 的开头,并且该文件作为 __main__ 模块执行。

如果脚本名称引用目录或 zip 文件,则脚本名称将添加到 sys.path 的开头,并且该位置中的 __main__.py 文件将作为 __main__ 模块执行。