这里似乎已经有很多关于python 3中的相对导入的问题,但是在经历了许多问题之后,我仍然没有找到我的问题的答案。这就是问题所在。
我下面有一个包裹
package/
__init__.py
A/
__init__.py
foo.py
test_A/
__init__.py
test.py
我在test.py中有一行:
from ..A import foo
现在,我在package
文件夹中,然后运行
python -m test_A.test
我收到消息
"ValueError: attempted relative import beyond top-level package"
但是,如果我在package
的父文件夹中,例如,我运行:
cd ..
python -m package.test_A.test
百事大吉。
现在我的问题是:当我在package
的文件夹中,我以test_A.test
的形式运行test_A子包中的模块,根据我的理解,..A
只上升了一个级别,这仍然在package
文件夹中,为什么它给出消息说beyond top-level package
。导致此错误消息的确切原因是什么?
发布于 2017-10-31 00:19:37
编辑:在其他问题中,这个问题有更好/更连贯的答案:
为什么不能工作?这是因为python没有记录包从哪里加载的。因此,当您执行python -m test_A.test
时,它基本上只是丢弃了test_A.test
实际上存储在package
中的知识(也就是说,package
不是一个包)。尝试from ..A import foo
正在尝试访问信息,它不再有任何信息(即加载位置的同级目录)。它在概念上类似于允许from ..os import path
在math
文件中使用。这将是不好的,因为您希望包是不同的。如果他们需要使用来自另一个包的东西,那么他们应该用from os import path
全局地引用它们,然后让python计算出$PATH
和$PYTHONPATH
在哪里。
当您使用python -m package.test_A.test
时,那么使用from ..A import foo
可以很好地解决问题,因为它跟踪了package
中的内容,并且您只是访问一个加载位置的子目录。
为什么不认为当前的工作目录是一个包?不知道,但是天哪,它会很有用。
发布于 2017-08-24 21:25:42
import sys
sys.path.append("..") # Adds higher directory to python modules path.
尝尝这个。为我工作过。
发布于 2015-06-05 10:53:02
假设:
如果您位于package
目录中,则A
和test_A
是单独的包。
结论:
..A
导入仅允许在包中进行。
进一步说明:
如果要强制使包可以放置在sys.path
上的任何路径上,则使相对导入仅在包中可用是非常有用的。
编辑:
难道只有我一个人认为这太疯狂了吗?为什么当前的工作目录不被认为是一个包?- 多猎手
当前工作目录通常位于sys.path中。所以,所有的文件都是重要的。这是自Python 2以来的行为,当包还不存在时。使正在运行的目录成为一个包,将允许以“导入.A”和“导入A”的形式导入模块,这将是两个不同的模块。也许这是一个不一致的考虑。
https://stackoverflow.com/questions/30669474
复制