【问题标题】:Why ImportError only with from?为什么 ImportError 只使用 from?
【发布时间】:2017-02-01 20:53:27
【问题描述】:

我有两个包,ab。它们在同一个目录中,b 依赖于a(但不是相反)。当我在b\some_package.py 中运行from . import a 时,我得到ImportError: cannot import name a。当我运行import a(从相应的目录)时,没有错误。两个包都有__init__.pys。 This answer 很好地解释了为什么,但没有提到如何解决这个问题。我该如何解决这个问题?

文件结构:

parent_directory
    a
     __init__.py
     module_in_a.py
    b
     __init__.py
     module_in_b.py (this imports a)

【问题讨论】:

  • 这些模块实际上是包的一部分吗?你没有提到任何包裹。为什么要尝试执行相对导入?
  • @user2357112 我又把这两个弄混了。我会解决的
  • 好吧,你为什么要尝试使用相对导入来导入完全不同的包?相对导入适用于b.foo 导入b.bar,而不是b.foo 导入a 等情况。
  • @user2357112 我在同一个目录中有两个包。一个模块需要访问另一个模块。如果没有相对导入,我该如何做到这一点,为什么不使用呢?
  • 使用常规导入 import a,就像您已经尝试过的那样。相对导入根本不是这项工作的工具。他们的角色不是你想象的那样。

标签: python python-2.7 import python-import


【解决方案1】:

包相对导入不能引用包外的模块。这在一般意义上是不可能的,因为它假定模块相对路径始终与文件系统目录相同。但是模块可以安装在很多地方,可以在鸡蛋等档案中。

如果您安装包ab,则没有问题。 Python 的virtualenv 可以帮助进行不影响系统 python 模块的本地安装。但是您也可以编辑PYTHONPATH 环境变量以指向您已安装ab 的位置,或者您可以在程序中更改sys.path。例如,

b/module_in_b.py

import sys
import os

_my_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
if _my_path not in sys.path:
    sys.path.append(_my_path)
del _my_path

import a

【讨论】:

    猜你喜欢
    • 2020-06-07
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 2022-11-09
    • 2017-06-14
    相关资源
    最近更新 更多