This question already has answers here:
ImportError: No module named … error in Python - set PYTHONPATH still not working

(2 个回答)


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 包可以执行类似的导入,并且适用于它们。

引发错误的命令:
  • 工作目录: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 ... 所做的那样(以及任何正常的导入语句都会这样做),完整的导入路径会被识别出来,并且可以正确解释相对导入。

    关于Python3 : Relative import beyond toplevel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46039467/

    10-12 22:49