Import 如何从父包和同级包导入python模块

Import 如何从父包和同级包导入python模块,import,python-2.7,Import,Python 2.7,这个(或类似的)问题以前被问过很多次,但在我的案例中没有一个解决方案是有效的。 我的项目结构如下: | project_2 main.py __init__.py systems.py | config __init__.py options.py | database __init__.py database.py

这个(或类似的)问题以前被问过很多次,但在我的案例中没有一个解决方案是有效的。 我的项目结构如下:

| 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:尝试在非包中进行相对导入。我已经尝试过使用包结构,其中所有内容(包括系统)都在自己的包中。它以相同的消息失败

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

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


另外,我实际上是从PEP 328中重新创建了这个示例,只是为了测试它,但它不起作用

当一个python文件执行相对导入,但该文件未通过另一个模块中的导入(例如,从命令行)作为模块加载时,就会出现这种情况。鉴于这种结构:

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

from test.a import A
print A
a、 py:

b、 py:

现在试试:

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文件执行相对导入,但该文件未通过另一个模块中的导入(例如,从命令行)作为模块加载时,就会出现这种情况。鉴于这种结构:

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

from test.a import A
print A
a、 py:

b、 py:

现在试试:

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路径,如果您从
项目2
文件夹运行脚本,则相对路径(如
配置选项
)将起作用。不幸的是,这需要在每台机器上更新PYTHONPATH


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

在Python 2.7.14上测试