想象一下目录结构:
/ a/ __init__.py b.py c.py c.py
档案/a/b.py
如下:
import c should_be_absolute = c
所有其他文件(包括__init__
)都是空的。
运行测试脚本时(使用python 2.7):
import a.b
print a.b.should_be_absolute
来自空目录的PYTHONPATH=/
(因此当前目录中没有任何内容添加到PYTHONPATH
)我得
<module 'a.c' from '/a/c.py'>
根据PEP 328和import <> is always absolute
语句,我希望:
<module 'c' from '/c.py'>
删除/a/c.py
文件时,输出符合预期。
我错过了什么?如果这是正确的行为 - 如何从c
(而不是b
)导入a.c
模块?
更新
根据python dev mailing list,它似乎是文档中的错误。默认情况下,python27中的导入不是绝对值。
答案 0 :(得分:26)
您需要在Python 2.7上添加from __future__ import absolute_import
或使用importlib.import_module('c')
这是Python 3的默认设置。
Python中存在一个错误:__future__.py
and its documentation claim absolute imports became mandatory in 2.7, but they didn't。
答案 1 :(得分:0)
如果您只是将/
添加到PYTHONPATH,那么搜索顺序仍然可以在当前目录中查找c
。如果你把所有东西放在一个root包下面并且绝对地引用它会好得多:
/myPackage
a/
__init__.py
b.py
c.py
__init__.py
c.py
和PYTHONPATH一样:export PYTHONPATH=/:$PYTHONPATH
所以在你的a.c
中,你会这样做:
from myPackage import c
from myPackage.c import Foo
import myPackage.c
这样,它始终与您的包相关。
答案 2 :(得分:-1)
“绝对”并不代表你认为它的那个;相反,它意味着“通常”的包解析过程发生:首先,它在包的目录中查找,然后在sys.path的所有元素中查找;其中包括PYTHONPATH的元素。
如果真的想要,你可以使用imp模块之类的工具,但我建议不要这样做。因为通常,您不必创建与标准Python发行版中的模块名称相同的模块。