【问题标题】:How has __init__.py changed?__init__.py 有什么变化?
【发布时间】:2015-07-10 16:58:41
【问题描述】:

我正在将我的 Python 2.7 东西(运行良好)迁移到 3.4.3。

在我的 C:\Python34\Lib\MyLibs 文件夹中,我有两个文件:__init__.pyutils.py 从 Python 2.7 中的同一文件夹复制过来。在 utils.py 中,我在顶部附近有这一行:

from __init__ import *

在 3.4.3 中,当我执行 import MyLibs.utils 时出现错误:

ImportError: 没有名为 __init__ 的模块

但是,我可以确认 __init__.py 中的代码在第一次运行 import 语句时已成功执行。

我可以知道如何在 Python 3 中导入或访问在 __init__.py 中声明的变量吗?

【问题讨论】:

  • 你为什么要__init__导入?
  • 我的代码部署在 Windows 和 Linux 机器上。我在__init__ 中保存了一些特定于平台的全局变量,因此这是我必须为每个站点自定义的唯一文件。
  • @OldGeezer:这里的名字很奇怪;你通常不会从__init__ 导入;您将从包名中导入 __init__.py 文件所在的位置。

标签: python python-3.x import packages


【解决方案1】:

Python 3 使用绝对导入,其中不合格的导入始终被视为顶级包。你没有这样的包。

您应该使用显式的相对导入:

from . import *

或使用绝对导入

from packagename import *

你也不应该在 Python 2 中首先使用from __init__ import * 。你可以改用from packagename import *

您可以在 Python 2 中启用绝对导入模型:

from __future__ import absolute_imports

PEP 328 - Imports: Multi-Line and Absolute/Relative

但是,您可能还会遇到其他问题。移植并不是那么简单,请阅读Porting to Python 3 book 中的问题。这个问题是a common migration problem

【讨论】:

  • 谢谢。 from MyLibs.__init__ import * 解决了这个问题。
  • @OldGeezer:使用from MyLibs import *__init__.py 存在只是因为目录不能包含源代码。否则,您将同时获得 sys.modules['MyLibs']sys.modules['MyLibs.__init__'] 条目,因此您的包有两组(单独的)全局变量。这可能会导致您以后难以调试的各种问题。
猜你喜欢
  • 2015-09-28
  • 2021-06-08
  • 2019-10-06
  • 2018-12-29
  • 2018-01-13
  • 1970-01-01
  • 2013-05-08
相关资源
最近更新 更多