如何从父包和兄弟包导入python模块

时间:2012-04-22 14:09:51

标签: import python-2.7

这个(或类似的)问题之前已被多次询问,但在我的案例中没有提供任何解决方案。 我的项目结构是这样的:

| 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

显然我需要在测试包下导入测试模块中的所有模块。我尝试使用点语法进行相对导入:

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

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

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

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

P.S。我实际上是从PEP 328重新创建了这个例子来测试它并且它不起作用。

2 个答案:

答案 0 :(得分:0)

当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

答案 1 :(得分:0)

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

在Python 2.7.14上测试