在Py3上嵌套`ImportError`但在Py2

时间:2016-07-27 23:32:10

标签: python python-2.7 python-3.x import packages

我无法理解嵌套导入在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'

但是,如果我使用Python 3.5运行package.py。我完全没有错误。

这对我来说似乎很奇怪,因为当package.py自行运行时import subpackage行正常工作,但是它正在运行&#39; (通过嵌套导入,不知道这是否是正确的术语),同一行找不到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

1 个答案:

答案 0 :(得分:2)

您应该使用:

<div ng-repeat="project in projects" ng-show="project.gid === parent_id">
  {{ project }}
</div>
from . import subpackage 中的