为什么调用带-m选项的模块将sys.path [0]设置为空字符串?

时间:2014-03-03 18:28:32

标签: python python-3.x

我目前的目录foo.py中有一个python脚本C:\test

这是代码。

import sys
print('sys.path:', sys.path)
print('sys.argv:', sys.argv)

当我将其作为脚本执行时,我会看到此输出。

C:\test>python foo.py
sys.path: ['C:\\test', 'C:\\Windows\\system32\\python34.zip', 'C:\\Python34\\DLLs', 'C:\\Python34\\lib', 'C:\\Python34', 'C:\\Python34\\lib\\site-packages']
sys.argv: ['foo.py']

但是当我作为模块执行它时,我看到了这个输出。

C:\test>python -m foo
sys.path: ['', 'C:\\Windows\\system32\\python34.zip', 'C:\\Python34\\DLLs', 'C:\\Python34\\lib', 'C:\\Python34', 'C:\\Python34\\lib\\site-packages']
sys.argv: ['C:\\test\\foo.py']

当我将程序作为模块执行时,为什么sys.path[0]变为空字符串?

http://docs.python.org/3.4/library/sys.html#sys.path上的文档提及:

  

在程序启动时初始化,此列表的第一项,   path [0],是包含用于的脚本的目录   调用Python解释器。如果脚本目录不是   可用的(例如,如果以交互方式调用解释器,或者如果是   脚本是从标准输入读取的),path [0]是空字符串,   它指示Python首先搜索当前目录中的模块。

因此,如果脚本目录不可用,则只应将sys.path[0]设置为''。但就我而言,即使在执行python -m foo时,脚本目录foo也清晰可用。因此,不应根据文档将sys.path[0]设置为''。相反,它应将其设置为'C:\\test'

它是文档中的错误还是Python解释器中的错误或我理解中的错误?

1 个答案:

答案 0 :(得分:7)

查看man python关于-m的说法:

  

-m module-name

     
    

sys.path中搜索指定的模块,并将相应的.py文件作为脚本运行。

  

如果您考虑一下,将包含.py文件的目录添加到sys.path中是没有意义的,因为它必须首先在那里找到。所以,IMO,行为是正确的。

但是文档说如果它作为脚本运行,那么包含它的目录应该放在sys.path之前。我会说这是文档中的错误,它应该说:

  

[...](例如,如果以交互方式调用解释器,或者如果从标准输入读取脚本,或者如果使用-m选项运行脚本)[... ]