【问题标题】:Python import AS fails with absolute importsPython import AS 因绝对导入而失败
【发布时间】:2012-09-19 12:32:44
【问题描述】:

在我长期使用 python 的经验中,我遇到了一个非常奇怪的问题..

提前我想说我想知道为什么会发生这种情况,而不是如何更改我的代码或如何修复它,因为我也可以做到。

我正在使用 python2.7.3 并使用 __future__ absolute_import 功能。 我有一个有点复杂的模块结构。我有一个模块q.x.y.z。如果在顶部我做import q.x.a.b 它可以工作,但如果我做import q.x.a.b as _b 它不能说 q.x 没有“a”(在这个模块之前已经导入了几次)任何人都有足够的经验知道发生了什么? 我很确定这不是循环导入问题,因为我只需要删除“as _b”就可以了。而且也不是命名问题,因为我对此非常小心。

文件结构如下:

q/
+ __init__.py
+ main.py #execution entry point
--- x/
    + __init__
    + a/
      + __init__
      + b.py 
   + y/
      + __init__
      + z.py # import q.x.a.b

它从 q 的父文件夹运行 pkg> python q\main.py 它包含以下内容:

from __future__ import absolute_import
import sys, os

if __name__=='__main__':
    sys.path[0] = os.getcwd()
    import q
    q.run()

与循环导入有点相关,但主要问题是为什么当我使用“as”时会发生这种情况?

回溯是这样的:

q/main.py: q.run()
q/x/__init__.py : from q.x import a, y, k
q/x/a/__init__.py : from q.x.a import d, e, f
q/x/a/f.py : from q.x.y import z as _z
q/x/y/__init__.py : from q.x.y import g, h, z
q/x/y/h.py : import q.x.a.d as _d

这有什么关系吗? https://stackoverflow.com/a/1835089/260242 或这个 https://stackoverflow.com/a/11309252/260242

代码示例,实际上失败了...转到 test/q/x/y/h.py 并将 import ... as _d 更改为 import ... 你会看到 http://puu.sh/16C3j

【问题讨论】:

  • 你如何执行你的代码?我的意思是,“main”的内容是什么,你启动它时的工作目录是什么?
  • @Nande -- 如果您edit 您的问题并在那里添加该信息,它会有所帮助。这使我们更容易解析等。
  • 关于sys.path[0] = os.getcwd():您确定要覆盖sys.path 的第一个元素,而不是像sys.path[0:0] = [os.getcwd()] 那样添加您的cwd?
  • 是的。以及如何适用于这个问题?

标签: python import namespaces python-2.7


【解决方案1】:

抱歉,无法重现,至少使用我周围的 Python 2.6.5。

请花时间找出一个在干净的树中显示问题的最小案例。我将从您当前树的副本开始,修剪任何不相关的目录并删除函数定义等,所有这些都在不断检查问题是否仍然存在。该过程要么收敛到一个显示错误的最小案例,要么(更有可能)显示一个看似无关的事情,却真正导致了这种奇怪的行为。

这是我在 Linux 控制台上的工作日志;您可以在一个空目录中重播它。

mkdir -p q/{x,y}
echo > q/__init__.py
echo > q/x/__init__.py
echo > q/y/__init__.py
mkdir -p q/x/a
echo > q/x/a/__init__.py
echo "place='This is q.x.a.b'" > q/x/a/b.py
echo -e "import q.x.a.b as _b\n\nprint _b.place" > q/y/z.py
python -c 'from __future__ import absolute_import; import q.y.z'

预计会打印This is q.x.a.b

【讨论】:

  • 对不起,伙计,但再次阅读问题,比这更复杂一些。我会给你留一个样本。
猜你喜欢
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多