Python 何时修改sys.path?
我在理解以下段落时遇到一些困难: 初始化后,Python程序可以修改Python 何时修改sys.path?,python,python-2.7,sys,Python,Python 2.7,Sys,我在理解以下段落时遇到一些困难: 初始化后,Python程序可以修改sys.path。这个 包含正在运行的脚本的目录放在开头 位于搜索路径的前面,位于标准库路径的前面这意味着 将加载该目录中的脚本,而不是 库目录中的名称相同。除非 打算更换。有关更多信息,请参阅“标准模块”一节 信息 比如说,我有以下模块,名为demo.py: if __name__ == '__main__': import sys print sys.path 在当前目录下还有另一个名为sys.py的模块,
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
- 如果在执行
后对其进行修改,打印系统路径
中不应出现系统路径
'/Users/sunqingyao/Documents'
import sys
和print sys之间。path
sys
是一个内置模块,它是解释器的一部分,无法屏蔽,因为解释器启动时已经加载了它
这是因为sys.modules
是加载模块的核心注册表,而sys.modules['sys']
指向自身。任何import sys
语句都会在需要搜索模块路径之前找到sys.modules['sys']
sys
不是唯一的内置模块,尽管它是唯一一个自动加载的模块。有关编译成Python二进制文件的其他模块,请参见
更新
sys.path
是系统的责任;它是作为Python引导过程的一部分加载的,除非您使用了。在您的问题中混淆了sys.argv
和sys.path
。你说的是哪一个?sys
是一个内置模块,不能被屏蔽。可以注意到,如果没有加载sys
,要访问sys.path
,导入机制甚至不知道在哪里查找外部sys
模块。但是如果sys
是自动加载的,为什么我们需要编写import sys
?@sunqingyao:import
执行两件事:如果尚未加载模块,则加载模块(插入到sys.modules
),并在当前模块中绑定名称。@sunqingyao:withoutimport sys
名称将在您的模块中不可用。因此,import sys
不需要执行加载步骤,但仍然需要绑定名称。@孙庆尧:仔细查看您键入的内容。你的名字拼错了。