3

是的,有类似的问题,但他们没有回答我的问题。我的目录结构如下,所有 __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 软件包可以进行类似的导入,并且适用于它们。

引发错误的命令:

  1. 工作目录:Package/
  2. 命令:python /path/to/Package/sub_package2/file2.py
4

1 回答 1

5

不幸的是,相对导入是否有效取决于您调用代码的方式。

$ 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 ...(以及任何正常的导入语句都会做的那样),完整的导入路径被识别并且可以正确解释相对导入。

于 2017-09-04T14:47:54.950 回答