【发布时间】: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