我foo.py在当前目录中有一个python脚本C:\test.
这是代码.
import sys
print('sys.path:', sys.path)
print('sys.argv:', sys.argv)
Run Code Online (Sandbox Code Playgroud)
当我作为脚本执行它时,我看到了这个输出.
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']
Run Code Online (Sandbox Code Playgroud)
但是当我作为模块执行它时,我看到了这个输出.
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']
Run Code Online (Sandbox Code Playgroud)
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解释器中的错误或我理解中的错误?
看看有什么man python说-m:
-m module-name搜索
sys.path命名模块并将相应的.py文件作为脚本运行.
如果你考虑一下,添加包含要运行的.py文件的目录是没有意义的sys.path,因为它必须首先在那里找到.所以,IMO,行为是正确的.
但是文档说如果它作为脚本运行,那么应该预先包含包含它的目录sys.path.我会说这是文档中的错误,它应该说:
[...](例如,如果以交互方式调用解释器,或者如果从标准输入读取脚本,或者如果使用
-m选项运行脚本)[...]