2017-09-04 40 views
2

是的,有类似的问题,但它们不回答我的问题。我的目录结构如下,所有的__init__.py文件都是空白的Python3:超出顶层的相对导入

Package/ 
    __init__.py 
    sub_package1/ 
      __init__.py 
      file1.py 
    sub_package2/ 
      __init__.py 
      file2.py 

在​​我有以下代码:

from ..sub_package1 import file1 

我得到上面提到的错误,

ValueError: attempted relative import beyond top-level package 

有许多scikit学习包里面做类似的进口和它适用于他们。

命令引发错误:

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

你可以包括“什么命令”引发异常? – MSeifert

+0

添加了引发错误的命令。 –

+0

我链接的重复是一个不同的例外,但同样的解决方案(也是@ Jean-Paul在下面回答的同样的解决方案) –

回答

4

无论相对导入工作,取决于你如何调用的代码,很遗憾。

[email protected]:/tmp$ mkdir Package Package/sub_package{1,2} 
[email protected]:/tmp$ touch Package/__init__.py Package/sub_package{1,2}/__init__.py 
[email protected]:/tmp$ touch Package/sub_package1/file1.py 
[email protected]:/tmp$ echo "from ..sub_package1 import file1" > Package/sub_package2/file2.py 
[email protected]:/tmp$ 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 
[email protected]:/tmp$ python -m Package.sub_package2.file2 
[email protected]:/tmp$ 

当你python Package/sub_package2/file2.py运行时不能识别Package/sub_package2是模块路径的一部分。它认为你正在使用的模块只是file2。所以它不能解释..的相对导入。

当您使用其完整路径导入模块时,如python -m ...所做的(和任何常规导入语句一样),可以识别完整的导入路径,并且可以正确解释相对导入。

+0

我得到错误(超出顶层):'''ValueError:企图相对导入超出顶层包''',而不是“非包” –

+1

我不确定异常的特定文本很重要。确实,你遇到了一个与我展示的略有不同的错误路径。但是,这两种错误的根本原因都是一样的。使用一个源文件,这个文件应该是一个子包,就像它是一个顶层脚本一样。如果你避免这种情况,那么你会从这类错误中安然无恙。 –