不应该';在python27中,默认情况下导入不是绝对的吗?
想象一下目录结构: / a/ __init__.py b.py c.py c.py 所有其他文件(包括不应该';在python27中,默认情况下导入不是绝对的吗?,python,import,Python,Import,想象一下目录结构: / a/ __init__.py b.py c.py c.py 所有其他文件(包括\uuuu init\uuuu)均为空 运行测试脚本时(使用python 2.7): 使用空目录中的PYTHONPATH=/(因此当前目录中的PYTHONPATH没有添加任何内容),我可以 其中,根据和语句import始终是绝对的 <module 'c' from '/c.py'> 当我删除/a/c.py文件时
\uuuu init\uuuu
)均为空
运行测试脚本时(使用python 2.7):
使用空目录中的PYTHONPATH=/
(因此当前目录中的PYTHONPATH
没有添加任何内容),我可以
其中,根据和语句import始终是绝对的
<module 'c' from '/c.py'>
当我删除/a/c.py
文件时,输出与预期一样
我错过了什么?如果这是正确的行为-如何从b
(而不是a.c
)导入c
模块
更新:
据了解,这似乎是文档中的一个bug。在python27中,默认情况下导入是而不是绝对的。如果您只是将
/
添加到PYTHONPATH,则搜索顺序可能仍然在当前目录中查找c
。如果您将所有内容都放在根包下,并绝对引用它,会更好:
/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
这样,它总是相对于您的包。“绝对”并不意味着您认为它是相对的;相反,这意味着将执行“常规”包解析过程:首先,它查找包的目录,然后查找sys.path的所有元素;其中包括PYTHONPATH中的元素
如果你真的想,你可以使用像imp模块这样的工具,但是我建议你不要使用它。因为一般来说,您不必创建与标准Python发行版中的模块同名的模块。您需要在Python 2.7上添加来自未来导入绝对导入的
,或者使用导入lib.import\u模块('c')
它是Python 3上的默认值
Python中有一个错误:。您的完整Python路径是什么?它是唯一的吗?您可能应该使用名为fwiw的根包,这在Python 3中可以正常工作。@jdi-是的,根是PYTHONPATH中唯一的东西(编辑原始帖子使其更明确),谢谢,但问题更多的是,这是一种正确的行为,而不是如何重新组织代码使其工作。我正在解决的实际问题是,“c”是python内置模块的名称,我正在处理的包中的代码正在跟踪它(根据python文档不应该这样做),这要感谢@Ivo,但声明绝对导入始终是一个可以从sys.path访问的模块或包。首先,包目录中的查找没有任何内容。你能指出一些记录你描述的行为的资源吗?在实现过程中非常清楚:“如果要导入的模块应该包含在包中,那么传递给find_module()的第二个参数(父包上的path)将用作路径源。”“首先,它在包的目录中查找”。不,那是相对重要的。你说得对!在进一步挖掘之后,我找到了指向的链接,确认在python27中默认情况下绝对_导入功能没有打开。
<module 'c' from '/c.py'>
/myPackage
a/
__init__.py
b.py
c.py
__init__.py
c.py
from myPackage import c
from myPackage.c import Foo
import myPackage.c