2

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

| 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 在主包中,但这并不能解释为什么其余的相对导入也不起作用。

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

4

2 回答 2

0

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

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

主要.py:

from test.a import A
print 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
于 2012-05-15T07:21:26.127 回答
0

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

在 Python 2.7.14 上测试

于 2017-09-28T20:48:37.640 回答