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

时间:2014-05-23 13:45:18

标签: python flask pycharm python-import

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

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

script1.pyscript2.py我可以运行此from models.model1 import Class1, Class2并且它可以正常运行。使用PyCharm时,我可以在app.py中使用相同的导入行。

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

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

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

1 个答案:

答案 0 :(得分:2)

您必须确保将work_dir添加到sys.path或PYTHONPATH中。

Python会自动将脚本文件的父文件夹添加到sys.path中。因此,如果您在shell中运行app.py,则只会将FlaskControlPanel插入到sys.path中,而python可以找到models所在的位置。

但是在pycharm中,它总是在sys.path中添加work_dir。这就是为什么你可以毫无问题地运行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文件的zipfile。

     

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

     

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

     

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