我一直在学习Python,我在2.7.3工作,我正在尝试理解import
语句。
documentation表示当您尝试导入模块时,解释器将首先搜索其中一个内置模块。
内置模块是什么意思?
然后,文档说解释器在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如何知道在哪里查找它们?
环境变量如何运作?根据我的理解,环境变量是特定于它们设置的过程,但是,如果我打开多个终端窗口并运行env
,它们都会显示许多相同的变量,例如{{1} }。我知道持久性环境变量的文件位置,例如PATH
,其中包含我的/etc/environment
变量。是否可以分辨存储持久环境变量的位置?存储新的持久环境变量的建议位置是什么?环境变量实际上如何使用Python解释器? Python解释器查找PATH
,但它如何在细节级别工作?
答案 0 :(得分:6)
一气呵成的问题很多! :)
我试着只回答其中几个。
1)内置模块是python发行版附带的任何模块。例如,sys和os模块是内置模块。就是这样。
2)系统默认情况下PYTHONPATH变量不存在。当你启动python解释器时,它会按照你描述的方式填充搜索模块的路径数组。 这是sys.path的结果。但是sys.path不是环境变量PYTHONPATH。 如果在系统中设置PYTHONPATH,那么其中包含的所有路径都将包含在python的解释器用于搜索模块的数组中。
我会为其他人留下环境变量的答案,因为我觉得我不是回答这个问题的合适人选。 我的感觉是,它可能会在不同系统之间发生变化。总之...
希望它有所帮助。
答案 1 :(得分:2)
内置模块是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。
如果找不到PYTHONPATH
,则它不包含任何额外目录。但是,您链接的文档还指出python使用"依赖于安装的默认值"。您在sys.path
中看到的目录在此" installation-depedent default"中定义。如果您定义PYTHONPATH
,则可以在默认值之前将其他目录添加到sys.path
,但如果没有定义则不会造成任何损害。
环境变量是按进程定义的,但shell可以提供自己的"范围"变量到它们启动的子过程。例如,您可以在shell文件中设置环境变量,例如~/.bashrc
或~/.profile
。
如果您使用的是Ubuntu,那么定义系统范围和持久环境变量的首选方法是使用pam_enviroment
。您可以在Ask Ubuntu上看到this问题,该问题显示了如何设置系统范围的环境变量。
AFAIK没有为每个(例如)Linux发行版设置它们的标准方法,显然,每个操作系统都有自己的定义方法。
如果您想了解有关环境变量处理的更详细说明,您可以在Super User上询问。
答案 2 :(得分:0)
PYTHONPATH
。这意味着您在sys.path
中看到的所有内容除外
''
是“依赖于安装的默认设置。”
环境变量表征环境,而不是流程。但是,您可以使用Linux env
命令在启动进程时调整它们。这基本上意味着该过程将在不同的环境中运行。您的问题的“如果工作”部分可以具有平台相关的答案。但是,如果您指的是文件,我认为您无法“告知存储持久性环境变量的位置”。可以在某些位置(通常在启动时)或仅在命令行中执行的任何文件中设置环境变量。