这里似乎已经有了一些关于python 3中相对导入的问题,但在浏览了许多之后,我仍然没有找到我的问题的答案。
问题来了。
我有一个如下所示的包
package/
__init__.py
A/
__init__.py
foo.py
test_A/
__init__.py
test.py
我在test.py中有一行:
from ..A import foo
现在,我在包的文件夹,我运行
python -m test_A.test
我收到消息
"ValueError: attempted relative import beyond top-level package"
但是如果我在包的父文件夹中,例如,我运行:
cd ..
python -m package.test_A.test
一切都很好。
现在我的问题是:
当我在包的文件夹中,我运行test_A子包中的模块作为test_A。测试,根据我的理解,..A只上升了一层,仍然在包文件夹中,为什么它给出消息说在顶层包之外。导致此错误消息的确切原因是什么?
正如最流行的答案所暗示的那样,基本上是因为你的PYTHONPATH或sys。路径包含。但不是你拿到包裹的路径。相对导入是相对于你当前的工作目录,而不是导入发生的文件;奇怪的是。
你可以通过先将相对导入更改为绝对导入来解决这个问题,然后以以下方式开始:
PYTHONPATH=/path/to/package python -m test_A.test
OR在以这种方式调用时强制python路径,因为:
使用python -m test_A。测试你正在使用__name__ == '__main__'和__file__ == '/absolute/path/to/test_A/test.py'执行test_A/test.py
这意味着在test.py中,你可以在main case条件下使用绝对导入半保护,也可以做一些一次性的Python路径操作:
from os import path
…
def main():
…
if __name__ == '__main__':
import sys
sys.path.append(path.join(path.dirname(__file__), '..'))
from A import foo
exit(main())
这些解决方案在3.6中都不适合我,文件夹结构如下:
package1/
subpackage1/
module1.py
package2/
subpackage2/
module2.py
我的目标是从module1导入到module2。奇怪的是,最后对我有用的是:
import sys
sys.path.append(".")
注意单点解决方案,而不是迄今为止提到的两点解决方案。
编辑:以下内容帮助我澄清了这一点:
import os
print (os.getcwd())
在我的例子中,工作目录(出乎意料地)是项目的根目录。