初始化后,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 sys
和print sys.path
之间进行修改也很奇怪。
答案 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。