Python 为什么reqular包中的路径[0]是搜索的唯一索引?
当我用Python创建一个常规包时,我会得到一个带有Python 为什么reqular包中的路径[0]是搜索的唯一索引?,python,python-2.7,Python,Python 2.7,当我用Python创建一个常规包时,我会得到一个带有\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu方法的对象,根据Python文档,它被认为是一种特殊类型的模块。我的问题是为什么在pack.\uuu路径\uuu列表中只搜索第一个项目,而忽略其他项目,以及为什么它是一个列表而不是一个普通字符串,因为其他项目没有被扫描 例如: 假设我们有一个目录名C:\code,其中包含一个包名pkg。以及另一个包含spam.py的路径: C\ pkg\
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法的对象,根据Python文档,它被认为是一种特殊类型的模块。我的问题是为什么在pack.\uuu路径\uuu
列表中只搜索第一个项目,而忽略其他项目,以及为什么它是一个列表而不是一个普通字符串,因为其他项目没有被扫描
例如:
假设我们有一个目录名C:\code,其中包含一个包名pkg。以及另一个包含spam.py的路径:
C\
pkg\ #Regular package
.__init__.py
another\
spam.py #print('spam')
所以我想知道为什么Python只遍历
\uuuu路径\uuuu[0]
,而不是像在3.X中那样遍历命名空间包的整个列表?如果未完全遍历,则将\uuu路径\uu
作为列表是没有意义的。我知道常规包不同于命名空间包,但为什么要在这里列出一个列表,并且只允许单个搜索路径呢!但是,Python3.3遍历整个列表,在某些形式下,它通过在常规包的\uuuuu path\uuuu
属性中添加目录来模拟命名空间包的行为 \uuuu路径\uuuu[0]
不是Python在包中搜索相对导入的唯一路径。至少这是我在CPython2.7和Python3.3中测试的真实行为。当使用相对导入时,Python从左到右遍历\uuuuu路径\uuuu[0]
。\uuuu path\uuu[0]
列表所起的作用与sys.path
的作用相同。它们都包含系统路径(目录前缀),这些路径指向Python在使用任何导入语句(例如,import
,from
)时自动收集的包或模块
实际上,您可以使用pkgutil.extend\u path
函数扩展\uuu path\uuu[0]
,以允许相对包从包目录以外的其他目录导入。例如:
C:
\dir0 #container directory
\pkg #package
__init__.py
spam.py
\dir1
ham.py
>>> __path__
['C:\\dir0']
假设\uuuu init\uuuuu.py
文件(初始化文件)包含以下代码段:
__path__.append(r'C:\\dir1') #Or pkgutil.extend_path function
from . import spam,ham #Relative import(relative to pkg dir)
垃圾邮件
将从程序包目录导入,因为这在2.X和3.X中都是相对导入。但是,请注意如何成功导入ham
,即使它不像spam
模块那样位于包的主目录中,它仍然可以作为包pkg
的路径列表中模块ham
的目录导入
由于ham
是在没有任何错误的情况下自动导入的,这表明Python从左到右遍历包的\uuuuuu路径
列表
尽管如此,您可以将\uuuuuuuuuuuuuuuuuuu
视为sys.path
,但\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>仅用于包内的导入。Python2.X在sys.path
之前搜索。这是相对的,然后是绝对的。Python3.X将其更改为仅限绝对值,除非在from
import语句中使用点,from。导入…
,Python 3.X将始终搜索模块搜索路径 我无法在Python2.6和2.7中重现这种行为;在Python2.6.9和2.7.9上搜索\uuuuuuu path\uuuuuu
的所有元素。@AnttiHaapala,你是对的,我已经为这个问题写了答案。
__path__.append(r'C:\\dir1') #Or pkgutil.extend_path function
from . import spam,ham #Relative import(relative to pkg dir)