Python3: 超越顶层的相对导入
Python3: Relative import beyond toplevel
是的,有类似的问题,但他们没有回答我的问题。我的目录结构如下,所有__init__.py个文件都是空白.
Package/
__init__.py
sub_package1/
__init__.py
file1.py
sub_package2/
__init__.py
file2.py
在file2.py
中我有以下代码:
from ..sub_package1 import file1
我收到上面提到的错误,
ValueError: attempted relative import beyond top-level package
有许多 scikit-learn 包可以执行类似的导入并且适用于它们。
引发错误的命令:
- 工作目录:
Package/
- 命令:
python /path/to/Package/sub_package2/file2.py
遗憾的是,相对导入是否有效取决于您调用代码的方式。
$ mkdir Package Package/sub_package{1,2}
$ touch Package/__init__.py Package/sub_package{1,2}/__init__.py
$ touch Package/sub_package1/file1.py
$ echo "from ..sub_package1 import file1" > Package/sub_package2/file2.py
$ python Package/sub_package2/file2.py
Traceback (most recent call last):
File "Package/sub_package2/file2.py", line 1, in <module>
from ..sub_package1 import file1
ValueError: Attempted relative import in non-package
$ python -m Package.sub_package2.file2
$
当您 python Package/sub_package2/file2.py
时,运行时无法识别 Package/sub_package2
是模块路径的一部分。它认为您正在使用的模块只是 file2
。所以它无法解释 ..
相对导入。
当您使用完整路径导入模块时,如 python -m ...
所做的那样(以及任何正常的导入语句都会做的),完整的导入路径被识别并且可以正确解释相对导入。
是的,有类似的问题,但他们没有回答我的问题。我的目录结构如下,所有__init__.py个文件都是空白.
Package/
__init__.py
sub_package1/
__init__.py
file1.py
sub_package2/
__init__.py
file2.py
在file2.py
中我有以下代码:
from ..sub_package1 import file1
我收到上面提到的错误,
ValueError: attempted relative import beyond top-level package
有许多 scikit-learn 包可以执行类似的导入并且适用于它们。
引发错误的命令:
- 工作目录:
Package/
- 命令:
python /path/to/Package/sub_package2/file2.py
遗憾的是,相对导入是否有效取决于您调用代码的方式。
$ mkdir Package Package/sub_package{1,2}
$ touch Package/__init__.py Package/sub_package{1,2}/__init__.py
$ touch Package/sub_package1/file1.py
$ echo "from ..sub_package1 import file1" > Package/sub_package2/file2.py
$ python Package/sub_package2/file2.py
Traceback (most recent call last):
File "Package/sub_package2/file2.py", line 1, in <module>
from ..sub_package1 import file1
ValueError: Attempted relative import in non-package
$ python -m Package.sub_package2.file2
$
当您 python Package/sub_package2/file2.py
时,运行时无法识别 Package/sub_package2
是模块路径的一部分。它认为您正在使用的模块只是 file2
。所以它无法解释 ..
相对导入。
当您使用完整路径导入模块时,如 python -m ...
所做的那样(以及任何正常的导入语句都会做的),完整的导入路径被识别并且可以正确解释相对导入。