我试图了解python解释器如何导入模块。导入模块时,解释器会搜索sys.path中的路径。我不理解解释器如何固有地导入sys模块,以及它在哪里找到sys模块?如果解释器固有地具有sys模块,为什么我们必须导入sys模块才能使用该模块的功能和变量?
import math
例如,当我们导入数学包时,将在sys.path目录中对其进行检查,但是如何知道sys.path的实际位置呢? 感谢您的帮助
答案 0 :(得分:1)
sys
模块是访问python内部结构(如对象大小,模块加载路径)的方式。
sys.path
一个字符串列表,它指定模块的搜索路径。从环境变量PYTHONPATH初始化,再加上依赖于安装的默认值。
在启动时,python读取PYTHONPATH
环境。变量,添加其他一些内置路径,然后运行您的模块。使用import
时,它只是在内部路径列表中查找模块。
当您导入sys
并更改path
时,它会在python内部路径中反映。但这只是一个API。如果他们创建了add_path
(和remove_path
,get_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”一词对于您来说是免费的,例如,作为变量或函数名称使用-最好为程序员保留尽可能多的名称。