【问题标题】:How to import python modules from parent and sibling packages如何从父包和兄弟包中导入 python 模块
【发布时间】:2012-04-22 14:09:51
【问题描述】:

这个(或类似的)问题之前已经被问过很多次了,但在我的情况下,没有一个提供的解决方案有效。 我的项目结构是这样的:

| project_2
      main.py
      __init__.py
      systems.py
      | config
            __init__.py
            options.py
      | database
            __init__.py
            database.py
            entity.py
      | tests
            __init__.py
            test_systems.py
            test_options.py
            test_database.py
            test_entity.py

显然我需要导入tests包下的test modules中的所有模块。我尝试了使用点语法的相对导入:

from ..systems import System
from ..config import options
from ..database.entity import Entity

返回 ValueError:尝试在非包中进行相对导入。我已经尝试过一个包结构,其中所有东西(包括系统)都在它自己的包中。它失败并显示相同的消息。

真正困扰我的是这应该可以工作:PEP 328,但它没有。我真的很想避免将包附加到 $PYTHONPATH 或使用一些疯狂的方法,例如从文件路径加载带有 imp 的模块。

我读到问题的一部分可能是 systems.py 在主包中,但这并不能解释为什么其余的相对导入也不起作用。

附:实际上,我从 PEP 328 重新创建了示例只是为了对其进行测试,但它不起作用。

【问题讨论】:

    标签: import python-2.7


    【解决方案1】:

    当一个 python 文件进行相对导入时,您会得到它,但该文件没有通过导入另一个模块(但例如从命令行)作为模块加载。鉴于这种结构:

    .
    ├── main.py
    └── test
        ├── __init__.py
        ├── a.py
        └── b.py
    

    main.py:

    from test.a import A
    print A
    

    a.py:

    from .b import B
    A = B
    
    if __name__ == '__main__':
        print A
    

    b.py:

    B = 'b'
    

    现在试试:

    python main.py
    

    结果是

    b
    

    python test/a.py
    

    你得到:

    Traceback (most recent call last):
      File "test/a.py", line 1, in <module>
        from .b import B
    ValueError: Attempted relative import in non-package
    

    起作用的是:

    python -m test.a
    

    【讨论】:

      【解决方案2】:

      如果您只是将. 添加到您的python 路径,如果您从project_2 文件夹中运行脚本,则相对路径(例如config.options)将起作用。不幸的是,这需要更新每台机器上的 PYTHONPATH。

      在 Python 2.7.14 上测试

      【讨论】:

        猜你喜欢
        • 2017-09-25
        • 2017-08-30
        • 2021-10-05
        • 1970-01-01
        相关资源
        最近更新 更多