什么时候修改sys.path?

时间:2016-07-16 13:20:10

标签: python python-2.7 sys

我在official tutorial

中理解这段话有些困难
  

初始化后,Python程序可以修改sys.path。该   包含正在运行的脚本的目录放在开头   搜索路径的位置,在标准库路径之前。 这意味着   将加载该目录中的脚本而不是模块   库目录中的名称相同。这是一个错误,除非   打算替换。有关更多信息,请参见标准模块   信息。

说,我有以下模块,名为demo.py

if __name__ == '__main__':
    import sys
    print sys.path

当前目录下还有另一个名为sys.py的模块,仅包含pass。我想用这个模块“遮蔽”标准模块。

在终端,我执行了

sunqingyaos-MacBook-Air:Documents sunqingyao$ python demo.py
['/Users/sunqingyao/Documents', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', '/Library/Python/2.7/site-packages']

所以我的问题是:sys.path何时被修改?

  • 如果在执行 import sys之前修改,则应导入sys.py而不是标准模块。
  • 如果在执行 print sys.path后修改了,则'/Users/sunqingyao/Documents'中不应出现sys.path

在执行import sysprint sys.path之间进行修改也很奇怪。

1 个答案:

答案 0 :(得分:2)

sys是一个内置模块,它是解释器的一部分,并且无法屏蔽,因为它已在解释器启动时加载。

这是因为sys.modules是正在加载的模块的核心注册表,而sys.modules['sys']指向自身。在需要搜索模块路径之前,任何import sys语句都会找到sys.modules['sys']

sys不是唯一的内置模块,尽管它是唯一一个自动加载的模块。有关编译到Python二进制文件中的其他模块,请参阅sys.builtin_module_names tuple

site module有责任更新sys.path;除非您使用-S command line switch

,否则它将作为Python引导过程的一部分加载