Python导入优先级:包还是模块?
我不清楚如何正确命名这个问题。
情况1
假设我具有以下目录结构。
foo
|
+- bar/__init__.py
|
+- bar.py
如果我有
from foo import bar
我如何知道要导入哪个条(bar.py
或bar/__init__.py
)?有没有简单的方法可以自动检测到这种情况?
情况二
foo
|
+- foo.py
|
+- other.py
如果other.py有这一行
import foo
我如何知道要导入哪个foo(foo或foo.foo)?再次,这是否是一种简单的方法来自动检测到这种情况?
-
TLDR;如果程序包位于同一目录中,则它们优先于相同名称的模块。
从文档:
“当
spam
导入一个名为的模块时,解释器会spam.py
在当前目录中搜索一个文件,然后在环境变量指定的目录列表中搜索PYTHONPATH
。这具有与shell变量PATH相同的语法,即目录名称。”这有点误导,因为解释器还会寻找一个名为的包
spam
(一个spam
包含__init__.py
文件的目录)。由于目录条目是在搜索之前进行排序的,因此,如果程序包位于同一目录中,则它们优先于具有相同名称的模块,因为它们位于spam
之前spam.py
。请注意,“当前目录”是相对于主脚本路径(where
__name__ == '__main__' is True
)。因此,如果您正在/home/billg
通话/foo/bar.py
,则“当前目录”是指/foo
。