导入模块时,python解释器如何知道在哪里可以找到sys模块?

时间:2018-11-01 09:16:29

标签: python

我试图了解python解释器如何导入模块。导入模块时,解释器会搜索sys.path中的路径。我不理解解释器如何固有地导入sys模块,以及它在哪里找到sys模块?如果解释器固有地具有sys模块,为什么我们必须导入sys模块才能使用该模块的功能和变量?

import math

例如,当我们导入数学包时,将在sys.path目录中对其进行检查,但是如何知道sys.path的实际位置呢? 感谢您的帮助

2 个答案:

答案 0 :(得分:1)

sys模块是访问python内部结构(如对象大小,模块加载路径)的方式

  

sys.path

     

一个字符串列表,它指定模块的搜索路径。从环境变量PYTHONPATH初始化,再加上依赖于安装的默认值。

在启动时,python读取PYTHONPATH环境。变量,添加其他一些内置路径,然后运行您的模块。使用import时,它只是在内部路径列表中查找模块。

当您导入sys并更改path时,它会在python内部路径中反映。但这只是一个API。如果他们创建了add_path(和remove_pathget_path ....)方法,那将使事情变得不那么神奇了,也变得不那么自然了。

即使您不使用底层机制,该机制也仍处于活动状态。 sys.path是python级的API,因此每个人都知道如何更改配置,但是python不需要sys软件包即可操作。

答案 1 :(得分:0)

正如另一个答案所说,有很多默认路径:

  • PYTHONPATH环境变量
  • $prefix/lib/pythonX.Y在类Unix上,其中$prefix基本上是“二进制文件所在的位置”-因此默认情况下为/usr/lib/pythonX.Y,但也可以为virtualenv/lib/pythonX.Y。还有$execprefix,但通常与$prefix
  • 相同

重要的是,除了 ,还有几个内置模块。 sys是其中之一。当您编写import sys时,Python会首先查看内置列表,如果找到内置列表,它将不会打开任何文件,只需执行导入即可。

当您导入其他非内置模块时,python将在内部sys.path中查找它们。例如,python做的第一件事就是import site,它在sys.path上找到。该文件还包含添加其他导入位置的说明:site-packages目录,您的主目录路径,可能还有许多其他位置。

是的,sys模块是解释器中“固有”的模块之一。

那为什么要导入它?

好吧,基本上是因为它是一个模块,因此必须始终导入一个模块才能使用它。从某种意义上说,这只是一种形式-您可以通过不导入它来节省一点内存(即使系统的实际 code ,代表“ sys的内存也存在于您的程序中”)模块已加载),但这并不是很重要。

但是python开发团队决定永远不会自动导入模块,因此,当您要使用它时,必须明确要求它。这也意味着默认情况下,“ sys”一词对于您来说是免费的,例如,作为变量或函数名称使用-最好为程序员保留尽可能多的名称。