我很难理解嵌套导入如何在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
你不应该试图自己运行'package.py'。 – martineau
谢谢。重点只是试图理解为什么'subpackage'可以以一种方式导入,而不是另一种。当然,没有理由运行'package.py'。 – pbreach
在这种情况下,请参阅[_Relative进口第十亿次](http://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time) – martineau