在 Py3 上嵌套“ImportError”但在 Py2 上不嵌套
Nested `ImportError` on Py3 but not on Py2
我无法理解嵌套导入在 python 项目中的工作方式。例如:
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'
但是如果我运行package.py
和Python3.5。我完全没有错误。
这对我来说似乎很奇怪,因为当 package.py
本身是 运行 时,行 import subpackage
有效,但它是 'run'(不知道如果这是正确的术语)通过嵌套导入,同一行找不到 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
你应该使用:
from . import subpackage
在 package/package.py
.
我无法理解嵌套导入在 python 项目中的工作方式。例如:
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'
但是如果我运行package.py
和Python3.5。我完全没有错误。
这对我来说似乎很奇怪,因为当 package.py
本身是 运行 时,行 import subpackage
有效,但它是 'run'(不知道如果这是正确的术语)通过嵌套导入,同一行找不到 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
你应该使用:
from . import subpackage
在 package/package.py
.