sys.path()和PYTHONPATH问题

时间:2012-07-28 01:33:18

标签: python python-2.7 environment-variables

我一直在学习Python,我在2.7.3工作,我正在尝试理解import语句。

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

    内置模块是什么意思?

  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']
    

    现在,我假设''路径指向包含'script'的目录,因此我认为其余部分将来自我的PYTHONPATH环境变量。但是,当我转到终端并键入env时,PYTHONPATH不存在作为环境变量。我还尝试了import os然后os.environ,但我得到了相同的输出。

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

  3. 环境变量如何运作?根据我的理解,环境变量是特定于它们设置的过程,但是,如果我打开多个终端窗口并运行env,它们都会显示许多相同的变量,例如{{1} }。我知道持久性环境变量的文件位置,例如PATH,其中包含我的/etc/environment变量。是否可以分辨存储持久环境变量的位置?存储新的持久环境变量的建议位置是什么?环境变量实际上如何使用Python解释器? Python解释器查找PATH,但它如何在细节级别工作?

3 个答案:

答案 0 :(得分:6)

一气呵成的问题很多! :)

我试着只回答其中几个。

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

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

我会为其他人留下环境变量的答案,因为我觉得我不是回答这个问题的合适人选。 我的感觉是,它可能会在不同系统之间发生变化。总之...

希望它有所帮助。

答案 1 :(得分: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更改的更多信息,请参阅this

  2. 如果找不到PYTHONPATH,则它不包含任何额外目录。但是,您链接的文档还指出python使用"依赖于安装的默认值"。您在sys.path中看到的目录在此" installation-depedent default"中定义。如果您定义PYTHONPATH,则可以在默认值之前将其他目录添加到sys.path ,但如果没有定义则不会造成任何损害。

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

    如果您使用的是Ubuntu,那么定义系统范围和持久环境变量的首选方法是使用pam_enviroment。您可以在Ask Ubuntu上看到this问题,该问题显示了如何设置系统范围的环境变量。

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

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

答案 2 :(得分:0)

您的系统上未定义

PYTHONPATH。这意味着您在sys.path中看到的所有内容除外 ''是“依赖于安装的默认设置。”

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