何时修改 sys.path



我在官方教程中理解这一段有些困难:

初始化后,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之间。

sys是一个

内置模块,它是解释器的一部分,不能被屏蔽,因为它在解释器启动时已经加载。

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

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

site模块负责更新sys.path;它作为Python引导过程的一部分加载,除非你使用了-S命令行开关。

最新更新