我目前的目录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解释器中的错误或我理解中的错误?
答案 0 :(得分:7)
查看man python
关于-m
的说法:
-m module-name
在
sys.path
中搜索指定的模块,并将相应的.py文件作为脚本运行。
如果您考虑一下,将包含.py文件的目录添加到sys.path
中是没有意义的,因为它必须首先在那里找到。所以,IMO,行为是正确的。
但是文档说如果它作为脚本运行,那么包含它的目录应该放在sys.path
之前。我会说这是文档中的错误,它应该说:
[...](例如,如果以交互方式调用解释器,或者如果从标准输入读取脚本,或者如果使用
-m
选项运行脚本)[... ]