Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 何时修改sys.path?_Python_Python 2.7_Sys - Fatal编程技术网

Python 何时修改sys.path?

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的模块,

我在理解以下段落时遇到一些困难:

初始化后,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
    ,而不是标准模块
  • 如果在执行
    打印系统路径
    后对其进行修改,
    系统路径
    中不应出现
    '/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:without
import sys
名称将在您的模块中不可用。因此,
import sys
不需要执行加载步骤,但仍然需要绑定名称。@孙庆尧:仔细查看您键入的内容。你的名字拼错了。