【问题标题】:How does python interpreter know where to find sys module when modules are imported? [duplicate]导入模块时,python 解释器如何知道在哪里可以找到 sys 模块? [复制]
【发布时间】:2018-11-01 09:16:29
【问题描述】:

我正在尝试了解 python 解释器如何导入模块。导入模块时,解释器搜索 sys.path 中的路径。我不明白解释器如何固有地导入 sys 模块以及它在哪里找到 sys 模块?如果解释器天生就有 sys 模块,为什么我们必须导入 sys 模块才能使用该模块的函数和变量?

import math

例如,当我们导入数学包时,它会在 sys.path 目录中检查,但它如何知道 sys.path 实际在哪里? 感谢您的帮助

【问题讨论】:

    标签: python


    【解决方案1】:

    sys 模块是一种方式来访问 python 内部,如对象大小、模块加载路径。

    系统路径

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

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

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

    即使您不使用底层机制,它也是有效的。 sys.path是python级别的API所以大家都懂怎么改配置,但是python不需要sys包来操作。

    【讨论】:

    • 感谢您的回答。如果不是从 sys.path API,我也想知道 Python 如何读取路径
    【解决方案2】:

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

    • 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 模块是解释器中“固有”的模块之一。

    那为什么还要导入呢?

    嗯,基本上是因为它是一个模块,并且您必须始终导入一个模块才能使用它。在某种程度上,这只是一种形式 - 您可以通过不导入它来节省一点内存(表示“sys 存在于您的程序中的内存”,即使 sys 模块的实际 代码 是无论如何都加载了),但这并不重要。

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

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 1970-01-01
      • 2013-06-25
      • 2017-03-05
      • 2018-01-22
      • 2021-12-31
      • 2021-07-05
      • 2016-06-18
      • 1970-01-01
      相关资源
      最近更新 更多