具体示例:
在/tmp/test
中,我创建了一个文件itertools.py
,内容如下:
def f():
print("it is my own itertools.")
我知道有一个名为itertools
然后我从python3
,
/tmp/test
>>> import itertools
>>> itertools.__dict__
{'_tee': <class 'itertools._tee'>, 'groupby': <class 'itertools.groupby'>, ...}
所以我导入内置模块itertools
而不是/tmp/test/itertools.py
。
似乎Python在搜索nonbuiltin模块之前搜索内置模块。 这与Python modules with identical names (i.e., reusing standard module names in packages)相反。为什么呢?
一般规则:
从坚果壳中的Python
加载模块时,
__import__
首先检查是否 模块是内置的。元组sys.builtin_module_names
命名 所有内置模块,但重新绑定该元组不会影响 模块加载。
搜索内置模块也会查找模块 特定于平台的位置,例如Windows中的注册表。如果模块M不是内置的,
__import__
将M的代码作为文件系统上的文件查找。__import__
按顺序查看字符串,它们是列表sys.path
的项目。
从学习Python
在许多情况下,您可以依赖模块的自动特性 导入搜索路径,根本不需要配置此路径。如果 您希望能够跨目录导入用户定义的文件 但是,您需要了解搜索路径的工作原理 为了定制它。粗略地说,Python的模块搜索路径是 由这些主要组成部分的连接组成,其中一些组成部分 是预设的,你可以定制一些来告诉Python 在哪里看:
- 程序的主目录
- PYTHONPATH目录(如果设置)
- 标准库目录
- 任何.pth文件的内容(如果存在)
- 第三方扩展程序的网站包主页
醇>
学习Python中的五个位置是否存储在sys.path
中?
只有在sys.builtin_module_names
找不到内置模块后才能搜索学习Python中的五个位置?
是&#34; 3。标准库目录&#34;不包括内置模块?内置模块存储在哪里? &#34; 3之间有什么关系?标准库目录&#34;和内置模块?
感谢。
答案 0 :(得分:2)
这只是部分答案,但它可能有助于澄清一些概念。
内置模块通常用C语言实现(至少用于CPython)并进行编译。这些列在sys.builtin_module_names
中。此类模块的示例包括sys
,itertools
和_collections
(请注意前导下划线)。
然后是标准库模块。这些是普通的Python文件,位于Python安装中位于lib
文件夹中的Windows上。例如collections
(没有下划线)或copy
...
然后安装了扩展模块。这些可以是编译模块,普通Python文件等。在Windows上,这些可以在site_packages
文件夹中的lib
文件夹中找到。
如果我查看我的sys.path
:
['', # current directory
'...\\Python\\python35.zip', # no idea
'...\\Python\\DLLs', # compiled modules (not builtins)
'...\\Python\\lib', # standard library modules
'...\\Python', # Python installation folder
'...\\Python\\lib\\site-packages', # installed modules
...]
似乎1,3和5都包含在我的sys.path
中,因此可能 2和4(如果设置)也将包含在其中。但这也可能是Windows特有的。
关于你的标题问题:
在搜索nonbuiltin模块之前,Python是否会搜索内置模块?
是的!首先搜索内置函数,然后再查找当前目录或标准库(或已安装的模块)中的模块。
例如,如果当前工作目录中有sys.py
个copy.py
文件,请尝试:
>>> import sys # a builtin module
>>> sys
<module 'sys' (built-in)> ... not the one from the current working directory
>>> import copy # a standard library module
>>> copy.__file__
... current working directory ... not the one from the standard library
如果您真的对这些细节感兴趣,那么查阅importlib
文档和推荐的PEP可能是个好主意。就个人而言,出于好奇,我不会走这条路。