为什么(python -m ...)导致sys.argv像[' -c',...]

时间:2014-11-06 17:17:17

标签: python

我有一个简单的脚本test.py

import sys
print sys.argv

如果我跑

cmd中的

python test.py abcd

我会得到['test.py','abcd']。

但是,如果我跑

python -m test.py abcd 

我会得到

['-c', 'abcd']

E:\Program Files (x86)\py\python.exe: No module named test.py.  

为什么'-c'在这里?我搜索了Stack Overflow关于'-m'的使用,但仍然感到困惑。

1 个答案:

答案 0 :(得分:8)

-m开关告诉python查找模块或包以导入并运行它的__main__条目。请参阅-m switch documentation

  

sys.path搜索指定的模块,并将其内容作为__main__模块执行。

对于您的情况,这意味着Python正在寻找名为test.py(注意: 文件名称)。要找到它,Python首先导入模块test(来自您的test.py文件),以查找名为py的子模块。这失败了。但在此过程中,您的test模块仍然运行并打印出sys.argv

-c列表中的sys.argv开关是此过程如何工作的内部实现细节。有关详细信息,请参阅Python issue #8202

  

我记得,通过捎带现有的main.c语义,我使用了一些hack来让-m正确地实现-c。我会找到hack并用一些正确的'-c''-m'逻辑替换它。

如果您想使用-m开关,则需要放弃.py部分;这只是文件扩展名,而不是模块名称:

python -m test abcd