5

我认为 sys.path 是 Python 模块的所有搜索路径的完整列表。

但是,在我的 Ubuntu 机器上,“/usr/local/lib/python2.6/dist-packages/”几乎是我所有模块所在的位置,并且该路径不在 sys.path 中。而且我仍然可以在该路径上导入任何模块。

编辑,不正确:即使我将 sys.path 设置为空列表,我仍然可以从该路径导入。

dist-packages 路径的隐含知识从何而来?在这个隐含的搜索路径组中是否还有其他路径,或者它是什么?

编辑:我的帖子的第二部分似乎不是真的。事实上,“sys.path = []”意味着我不能导入任何东西,甚至不能从我当前的工作目录中导入。我很抱歉。

4

2 回答 2

4

请注意以下提到的依赖于安装的默认值:

6.1.2. 模块搜索路径

当一个名为的模块spam被导入时,解释器在包含输入脚本的目录中搜索一个名为的文件spam.py,然后在环境变量指定的目录列表中 搜索PYTHONPATH。这与 shell 变量具有相同的语法PATH,即目录名称列表。PYTHONPATH未设置时,或在此处未找到文件时,搜索将在依赖于 安装的默认路径中继续;在 Unix 上,这通常是 .:/usr/local/lib/python.

sys.path实际上,模块是在由包含输入脚本(或当前目录)的目录初始化的变量给出的目录列表中搜索的,PYTHONPATH以及依赖于安装的 default。这允许知道自己在做什么的 Python 程序可以修改或替换模块搜索路径。请注意,因为包含正在运行的脚本的目录位于搜索路径上,所以脚本不能与标准模块同名,否则 Python 会在导入该模块时尝试将脚本作为模块加载。这通常是一个错误。有关详细信息,请参阅标准模块部分。

编辑在我的 Ubuntu 盒子上,/usr/local/lib/python2.6/dist-packages存在于sys.path. 如果我清除sys.path然后尝试从上述目录导入模块,则不再有效。这表明解释器对该目录没有隐含的知识,并通过sys.path.

编辑当您进行实验时,请确保您sys.path在 Python 会话开始时进行修改。如果你import X,然后清除sys.path,然后import X再次,即使X不再打开,后者也不会失败sys.path

于 2011-07-14T17:37:56.020 回答
1

模块搜索路径

实际上,模块是在变量 sys.path 给出的目录列表中搜索的,该变量是从包含输入脚本(或当前目录)、PYTHONPATH 和安装相关默认值的目录初始化的。

您正在运行依赖于安装的默认设置。

有关安装相关搜索路径的更多信息

于 2011-07-14T17:38:09.780 回答