5

我一直在学习 Python,我正在使用 2.7.3,并且我正在尝试理解import语句。

  1. 文档说,当您尝试导入模块时,解释器将首先搜索其中一个内置模块。

    内置模块是什么意思?

  2. 然后,文档说解释器在 sys.path 列出的目录中搜索,并且 sys.path 是从这些源初始化的:

    • 包含输入脚本的目录(或当前目录)。
    • PYTHONPATH(目录名称列表,与 shell 变量的语法相同PATH)。
    • 安装相关的默认值。

    这是我的计算机在命令行模式下使用 python 的 sys.path 命令的示例输出:(我删除了一些,以免它很大)

    ['', '/usr/lib/python2.7', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']
    

    现在,我假设“”路径是指包含“脚本”的目录,所以我认为其余的将来自我的PYTHONPATH环境变量。但是,当我转到终端并键入env时,PYTHONPATH它不作为环境变量存在。我也试过import osos.environ,但我得到了相同的输出。

    我真的没有 PYTHONPATH 环境变量吗?我不相信我曾经专门定义过 PYTHONPATH 环境变量,但我认为当我安装新软件包时,它们会自动更改该环境变量。如果我没有 PYTHONPATH,我的 sys.path 是如何填充的?如果我下载新包,如果我没有这个 PYTHONPATH 变量,Python 怎么知道在哪里寻找它们?

  3. 环境变量如何工作?据我了解,环境变量特定于为其设置的进程,但是,如果我打开多个终端窗口并运行env,它们都会显示许多相同的变量,例如PATH. 我知道持久性环境变量的文件位置,例如/etc/environment,其中包含我的PATH变量。是否可以判断持久环境变量的存储位置?存储新的持久环境变量的推荐位置是什么?环境变量实际上如何与 Python 解释器一起工作?Python 解释器会寻找PYTHONPATH,但它在本质层面是如何工作的?

4

3 回答 3

7

一口气问这么多问题!:)

好吧,我试着只回答其中的几个。

1) 内置模块是 python 版本附带的任何模块。例如 sys 和 os 模块是内置模块。就是这样。

2) PYTHONPATH 变量在您的系统上默认不存在。当您启动 python 解释器时,它会按照您描述的方式填充搜索模块的路径数组。这是 sys.path 的结果。但是 sys.path 不是环境变量 PYTHONPATH。如果您在系统中设置 PYTHONPATH,则其中包含的所有路径都将包含在 python 解释器用于搜索模块的数组中。

我会将环境变量的答案留给其他人,因为我觉得我不是回答这样一个问题的合适人选。不过,我的感觉是,它可能会因系统而异。反正...

希望能帮助到你。

于 2012-08-06T12:34:17.623 回答
2
  1. 内置模块是列出的模块sys.builtin_module_names。这些模块与解释器一起编译,因此始终可用。请注意,它们是标准库的一部分,但标准库包含更多模块。为了清楚起见,如果您尝试在 python3.3 中运行此代码:

    >>> import sys
    >>> sys.path = []
    >>> import os          # works
    >>> import traceback   # ImportError, traceback is in the stdlib!
    

    在 python2 上,两者都成功,因为import标准库路径的特殊情况。(有关python3.3中更改的更多信息,请参阅此内容)。import

  2. 如果PYTHONPATH未找到,则它不包含任何额外的目录。但是,您链接的文档还指出 python 使用“依赖于安装的默认值”。您在您的目录中看到的目录是sys.path在这个“安装依赖默认值”中定义的。如果您定义了,PYTHONPATH您可以在默认目录sys.path 之前添加其他目录,但如果不定义它也不会造成任何损害。

  3. 环境变量是按进程定义的,但是 shell 可以为它们启动的子进程提供自己的变量“范围”。例如,您可以在 shell 文件中设置环境变量,例如~/.bashrc~/.profile.

    如果您在 Ubuntu 上,定义系统范围和持久环境变量的首选方法是使用pam_enviroment. 你可以在 Ask Ubuntu 上看到这个问题,它展示了如何设置系统范围的环境变量。

    AFAIK 没有为每个(例如)linux 发行版设置它们的标准方法,而且,显然,每个操作系统都有自己的定义它们的方法。

    如果您想了解有关环境变量处理的更详细说明,您可能应该在Super User上询问。

于 2014-03-08T13:00:34.620 回答
0

PYTHONPATH未在您的系统上定义。sys.path这意味着除了 ''“依赖于安装的默认设置”之外,您所看到的一切。

环境变量表征环境,而不是过程。但是,您可以在启动进程时使用例如 Linuxenv命令来调整它们。这基本上意味着该过程将在不同的环境中运行。您问题的“如果如何工作”部分可以有平台相关的答案。但是,如果您指的是文件,我认为您不能“判断持久环境变量的存储位置”。可以在某个时间点(通常在启动时)或仅在命令行中执行的任何文件中设置环境变量。

于 2012-08-06T12:49:27.223 回答