这个(或类似的)问题之前已被多次询问,但在我的案例中没有提供任何解决方案。 我的项目结构是这样的:
| 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重新创建了这个例子来测试它并且它不起作用。
答案 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上测试