【问题标题】:change in import in python3python3中导入的变化
【发布时间】:2018-11-18 01:04:05
【问题描述】:

我正在使用 python 3.4.4 并通过创建示例包来测试“init.py”功能但无法实现。在 python 2.7.13 版本的情况下,上述案例运行良好。谁能告诉我我正在做的错误,或者 python 3.x 版本的语法有什么变化。请帮我学习 Python 3?

目录结构:

TestPackage/
    __init__.py
    TestModule.py
run.py

TestModule.py 的内容:

def TestFun():
    print("Welcome")

__init__.py 的内容:

from TestModule import TestFun

run.py 的内容:

from TestPackage import TestFun
TestFun()

当我执行 run.py 文件时,出现以下错误:

Traceback (most recent call last):
  File "D:\CASE03\run01.py", line 1, in <module>
    from TestPackage import TestFun
  File "D:\CASE03\TestPackage\__init__.py", line 1, in <module>
    from TestModule import TestFun
ImportError: No module named 'TestModule'

但是当我使用 python 2.7.13 时,它工作得非常好。请指导我。

【问题讨论】:

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


    【解决方案1】:

    尝试将__init__.py 更改为以下代码:

    from TestPak.TestModule import TestFun
    

    【讨论】:

    • 虽然这会起作用,但它会将 init 文件的内容与包名(可能会更改)结合起来。没什么大不了的,但相对导入(前导点)存在并且看起来更清晰。
    【解决方案2】:

    __init__.py 内部,如果你改变了

    from TestModule import TestFun
    

    from .TestModule import TestFun
    

    您将获得预期的行为。

    请参阅:PEP 328(有关使用前导点的相对导入的部分)。

    【讨论】:

    【解决方案3】:

    最简单的解决方案是将__init__.py 设置为空白文件。如果您有兴趣在执行 from Testmodule import * 时控制从模块导入的内容,您可以在 __init__.py 文件中包含 __all__ = ['TestFun']

    【讨论】:

      猜你喜欢
      • 2012-08-23
      • 2013-11-07
      • 2014-08-17
      • 2018-08-13
      • 2016-03-20
      • 1970-01-01
      • 2019-06-29
      • 2021-12-17
      • 1970-01-01
      相关资源
      最近更新 更多