2016-07-27 60 views
0

我很难理解嵌套导入如何在python项目中工作。例如:在Py3上嵌套`ImportError`而在Py2上不能嵌套

test.py 
package/ 
    __init__.py 
    package.py 
    subpackage/ 
     __init__.py 

test.py

import package 

package/__init__.py

from .package import functionA 

package/package.py

import subpackage 

def functionA(): 
    pass 

在Python 3.5,当我运行test.py我碰到下面的错误,但没有错误在Python 2.7:

C:\Users\Patrick\Anaconda3\python.exe C:/Users/Patrick/Desktop/importtest/test.py 
Traceback (most recent call last): 
    File "C:/Users/Patrick/Desktop/importtest/test.py", line 1, in <module> 
    import package 
    File "C:\Users\Patrick\Desktop\importtest\package\__init__.py", line 1, in <module> 
    from .package import functionA 
    File "C:\Users\Patrick\Desktop\importtest\package\package.py", line 1, in <module> 
    import subpackage 
ImportError: No module named 'subpackage' 

但是如果我使用Python 3.5运行package.py。我根本没有错误。

这对我来说似乎很奇怪,因为当package.py自己行import subpackage工作,但它通过嵌套导入正在'运行'(不知道这是否是正确的术语),相同行无法找到subpackage

为什么在这种情况下Python 2.7和3.5之间存在差异,以及如何以2.7.x和3.x两种方式解决这个问题?

我认为这可能的事实是由于该import subpackage嵌套进口算作中嵌套导入一个隐含的相对进口而不是当package.py直接运行,但如果我不import .subpackage相反,我得到两个这样的错误2.7和3.5:

C:\Users\Patrick\Anaconda3\python.exe C:/Users/Patrick/Desktop/importtest/test.py 
Traceback (most recent call last): 
    File "C:/Users/Patrick/Desktop/importtest/test.py", line 1, in <module> 
    import package 
    File "C:\Users\Patrick\Desktop\importtest\package\__init__.py", line 1, in <module> 
    from .package import functionA 
    File "C:\Users\Patrick\Desktop\importtest\package\package.py", line 1 
    import .subpackage 
     ^
SyntaxError: invalid syntax 
+0

你不应该试图自己运行'package.py'。 – martineau

+0

谢谢。重点只是试图理解为什么'subpackage'可以以一种方式导入,而不是另一种。当然,没有理由运行'package.py'。 – pbreach

+1

在这种情况下,请参阅[_Relative进口第十亿次](http://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time) – martineau

回答

2

你应该使用:

from . import subpackage 

package/package.py

+2

@pylang你是什么意思? – donkopotamus

+0

“in package/package.py'中的哪些部分不清楚?你知道,在你的问题中有一个带有“import subpackage”的文件。 – martineau