【问题标题】:Import package from adjacent module works in Py2 but not in Py3从相邻模块导入包在 Py2 中有效,但在 Py3 中无效
【发布时间】:2016-12-01 23:54:40
【问题描述】:

我仍然习惯于构建 python 项目和相对导入,我认为我主要了解相对导入,直到我在 Py3 上测试时遇到问题。

我有一个结构如下的项目:

scriptA.py
package/__init__.py
          scriptB.py
          scriptC.py

__init.py__ 包含以下内容:

from scriptB import functionB
from scriptC import functionC

scriptA import package as _package 在 Py2.7 中工作,但在 Py3.5 上失败并出现错误 ImportError: No module named 'scriptB'

如何以与 Py2 和 3 兼容的方式导入 package?为什么会有所不同?

我尝试过使用import .package as _package,但这似乎并没有改变任何东西(仍在考虑何时使用......

【问题讨论】:

  • 我认为您正在执行隐式相对导入,这在 Py3 中是不允许的。如果你输入 from __future__ import absolute_import 这应该关闭隐式 rel。在 Py2 中也可以导入,并引发与 Py3 中相同的错误。 @pbreach 演示的“使用点”是explicit relative import 的一个示例,它与 Py2/3 兼容。改用显式的相对或绝对的导入,绝不是隐式的。

标签: python python-3.x packages python-2.x importerror


【解决方案1】:

所以问题是__init__.py 中的导入应该是相对导入,即:

from .scriptB import functionB
from .scriptC import functionC

我想这是导入模块和 python 包之间的区别之一。似乎在 Py3.5 中相对导入需要显式完成,因此引发了错误。这是我的解释。不幸的是,我在问题中提出的结构与我遇到的问题不够接近,所以这并不能解决它......但仍然欢迎对此提供更详细(并且可能更准确)的答案。

【讨论】:

    【解决方案2】:

    没有名为“scriptB”的模块

    看起来像路径错误。检查您的路径声明。 Windows 中的路径语句可以通过在开始菜单搜索栏中输入“system”来访问。从那里您可以访问“环境变量”,其中之一是“路径”语句。在那里,您可以看到 Python 脚本允许访问的不同目录。确保那里列出了您的 Python 3.x 目录和 Python 3.x/scripts 目录。
    路径语句中列出的文件有点像程序中的全局变量。如果 Python 2 和 Python 3 在它们的目录中都有 same 文件名,则您可能会访问不兼容的文件。我读到有一个 python 启动器可以解决这个问题,这样你就可以在同一台计算机上运行多个版本的 python。 现在我会测试看看这是否是你的问题 -将路径语句复制到备份文件,然后 -删除对 python 2.x 的引用, -重启 - 运行你的程序。 如果要运行多个版本的 python,请将原始路径语句复制回来并安装 python 启动器。

    【讨论】:

    • 感谢您的意见。你能再清楚一点吗?你的意思是检查 sys.path,如果是,我正在检查什么。这是评论而不是答案。
    猜你喜欢
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    相关资源
    最近更新 更多