【问题标题】:Relative Imports & Directory Structure (Trillionth Time)相对导入和目录结构(万亿次)
【发布时间】:2020-01-14 18:01:09
【问题描述】:

总结

我对设计成熟的 Python 项目还很陌生,我之前的所有 Python 工作都是使用 Jupyter Notebooks 完成的。现在我正在使用 Python 设计一些应用程序,但我很难让它“运行”。

我访问过以下网站 -

  1. Relative imports in Python

  2. Ultimate answer to relative python imports

  3. python relative import example code does not work

但他们似乎都没有解决我的问题。

问题

这是我的回购结构 -

my_app/
    __init__.py
    
    code/
        __init__.py
        module_1/
            some_code_1.py
        module_2/
            some_code_2.py
        module_3/
            some_code_3.py

        main.py

    tests/
        __init__.py
        module_1/
            test_some_code_1.py
        module_2/
            test_some_code_2.py
        module_3/
            test_some_code_3.py

    resources/
        __init__.py
        config.json
        data.csv

我主要使用PyCharmVS Code 进行开发和测试。

main.py 文件具有以下导入 -

from code.module_1.some_code_1 import class_1
from code.module_2.some_code_2 import class_2
from code.module_3.some_code_3 import class_3

PyCharm 运行配置中,我将working directory 设置为`User/blah/blah/my_app/

每当我从 PyCharm 运行 main.py 时,它都能完美运行。

但是如果我从终端运行程序 -

$ python code/main.py

Traceback (most recent call last):
  File "code/main.py", line 5, in <module>
    from code.module_1.some_code_1 import class_1
ModuleNotFoundError: No module named 'code.module_1.some_code_1'; 'code' is not a package

如果我从 VS Code 运行 main.py,我会得到同样的错误。

有没有办法让 PyC​​harm 和终端都能正常工作?

如果我将导入更改为 -

from module_1.some_code_1 import class_1
from module_2.some_code_2 import class_2
from module_3.some_code_3 import class_3

这在终端上有效,但在 PyCharm 中无效。测试用例也失败了。

我是否缺少某些东西,或者可以进行一些配置以使所有这些工作无缝?

有人可以帮我解决这个问题吗?

谢谢!

【问题讨论】:

    标签: python visual-studio-code pycharm


    【解决方案1】:

    问题是当您执行python code/main.py 时,它会使您的当前工​​作目录code/,这会使您的所有绝对导入都不正确,因为除非您明确更改PYTHONPATH 之类的设置,否则Python 看不到该目录上方环境变量。

    您最好的选择是将main.py 重命名为__main__.py,然后使用python -m code(尽管请注意包名与标准库中的模块冲突)。

    您也不需要my_app/ 中的__init__.py,除非您要将整个目录视为一个包。

    我会考虑使用相对导入而不是绝对导入(我还建议在导入语句中导入模块而不是模块中的对象/类,以避免循环导入问题)。例如,对于code.main 中的from code.module_1.some_code_1 import class_1 行,我将其设为from .module_1 import some_code_1

    【讨论】:

    • 谢谢,布雷特!您能否详细说明一下 - “我会考虑使用相对导入而不是绝对导入(我还建议在导入语句中导入模块而不是模块中的对象/类,以避免循环导入问题)。”那太好了!
    • @AdhishThite 我编辑了我的回复以提供一个示例。
    猜你喜欢
    • 2020-09-02
    • 2022-12-11
    • 2019-05-14
    • 2017-11-28
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2015-04-12
    相关资源
    最近更新 更多