在搜索nonbuiltin模块之前,Python是否会搜索内置模块?

时间:2017-09-09 18:05:15

标签: python python-3.x

具体示例:

/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   在哪里看:

     
      
  1. 程序的主目录
  2.   
  3. PYTHONPATH目录(如果设置)
  4.   
  5. 标准库目录
  6.   
  7. 任何.pth文件的内容(如果存在)
  8.   
  9. 第三方扩展程序的网站包主页
  10.   

学习Python中的五个位置是否存储在sys.path中?

只有在sys.builtin_module_names找不到内置模块后才能搜索学习Python中的五个位置?

是&#34; 3。标准库目录&#34;不包括内置模块?内置模块存储在哪里? &#34; 3之间有什么关系?标准库目录&#34;和内置模块?

感谢。

1 个答案:

答案 0 :(得分:2)

这只是部分答案,但它可能有助于澄清一些概念。

  • 内置模块通常用C语言实现(至少用于CPython)并进行编译。这些列在sys.builtin_module_names中。此类模块的示例包括sysitertools_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.pycopy.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可能是个好主意。就个人而言,出于好奇,我不会走这条路。