【问题标题】:Are there more search paths than in sys.path?搜索路径是否比 sys.path 中的多?
【发布时间】:2011-07-14 17:35:53
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 不要进行所有这些令人困惑的编辑并添加“EDIT”和“NOT TRUE”,只需删除不正确的部分,以便您的问题清晰易懂。

标签: python sys.path module-search-path


【解决方案1】:

注意following 中提到的依赖于安装的默认值

6.1.2。模块搜索路径

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

实际上,模块是在给出的目录列表中搜索的 变量sys.path 从包含的目录初始化 输入脚本(或当前目录),PYTHONPATH 安装依赖的默认值。这允许 Python 程序知道 他们正在做什么来修改或替换模块搜索路径。笔记 那是因为包含正在运行的脚本的目录位于 搜索路径,重要的是脚本不能与 标准模块,否则 Python 将尝试将脚本加载为 导入该模块时的模块。这通常是一个错误。 有关详细信息,请参阅标准模块部分。

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

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

【讨论】:

    【解决方案2】:

    Module Search Path

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

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

    More Information on installation-dependent search paths

    【讨论】:

    • 不,我的阅读方式与您不同。它说 sys.path 是搜索路径,并且 sys.path 是从依赖于安装的默认值初始化的。但是这个所谓的依赖于安装的默认值不会显示在 sys.path 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2012-06-07
    • 2011-03-26
    • 2013-07-31
    • 2013-11-07
    • 1970-01-01
    相关资源
    最近更新 更多