python 3 : Relative import beyond toplevel

标签 python python-3.x python-import relative-import

<分区>

是的,有类似的问题,但他们没有回答我的问题。我的目录结构如下,所有的__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

最佳答案

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

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

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

相关文章:

python - 即使函数适用于每个列系列,DataFrame.apply 与 str.extract 也会引发错误

python - 如何将列表转换为字典?

python - python unittest 导入问题

python - 在 Docker 容器中导入 python 文件

python - OS X Mavericks 上的 pip 安装失败并出现错误 :/usr/local/bin/pip: No such file or directory

python - 将图标添加到 Django 模板表中的特定行

python - 如何仅键入协议(protocol)方法的第一个位置参数并让其他参数不键入?

python - python 中的 Ascii 图

python - Python 3.5 中的 F 字符串无效语法

python - 无法从子文件夹中的 __init__ 导入