我在使用python的长期经验中遇到了一个非常奇怪的问题..
事先我想说我想知道为什么会发生这种情况,而不是如何更改我的代码或如何解决它,因为我也可以这样做。
我正在使用python2.7.3并使用__future__ absolute_import
功能。
我有一个复杂的模块结构..我有一个模块q.x.y.z
。如果在顶部我做import q.x.a.b
它可以工作,但是如果我做import q.x.a.b as _b
它没有说qx没有“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并更改导入...作为_d导入...你会看到 http://puu.sh/16C3j
答案 0 :(得分:2)
抱歉,无法重现,至少使用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
。