【问题标题】:Why does invoking a module with -m option set sys.path[0] to empty string?为什么使用 -m 选项调用模块将 sys.path[0] 设置为空字符串?
【发布时间】:2014-03-03 18:28:32
【问题描述】:

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

这里是代码。

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解释器中的错误或我理解的错误?

【问题讨论】:

  • 你在哪里看到空字符串?在这两种情况下,sys.path 都有一个 非空 第一个元素。区别在于它是否包含完整路径或相对路径。
  • @Bakuriu 您在哪里看到非空的第一个元素?您在此输出中看不到空字符串:sys.path: ['', 'C:\\Windows\\system32\\python34.zip', 'C:\\Python34\\DLLs', 'C:\\Python34\\lib', 'C:\\Python34', 'C:\\Python34\\lib\\site-packages']?
  • 触摸。在读取输出时,我将sys.argv 误读为sys.path

标签: python python-3.x


【解决方案1】:

看看man python 怎么说-m

-m module-name

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

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

但文档说,如果它作为脚本运行,则包含它的目录应该添加到sys.path。我会说这是文档中的错误,它应该说:

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

【讨论】:

  • 这是什么意思 man 以及如何将它安装到开始菜单?
  • @Cuadue: man 是用于阅读手册页的标准 Unix 命令。您只需转到终端并运行命令man <command>。如果您不知道,可能您正在运行一个非类 Unix 系统,例如 Windows,您没有一个简单的替代方案。对于 Python,至少你有集成的帮助文件。对于其他一切......你有互联网!要了解它的感觉,请访问Linux man pages
  • 如果您认为文档应该改进;你可以submit documentation patch
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
相关资源
最近更新 更多