在 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.