【问题标题】:Python sys.argv[0] not showing -c valuePython sys.argv[0] 不显示 -c 值
【发布时间】:2019-11-28 08:15:37
【问题描述】:

Python 新手,从文档线性开始: https://docs.python.org/3.7/library/sys.html

如果命令是使用解释器的 -c 命令行选项执行的,则 argv[0] 设置为字符串“-c”。如果没有将脚本名称传递给 Python 解释器,则 argv[0] 为空字符串。

我的代码:

import sys
print(sys.argv)

我的命令:

py main.py -c test

输出:

['main.py', '-c', 'test']

所以即使我输入 -c test sys.argv[0] 的值似乎是“main.py”,而文档说明它应该是“-c”。

所以这里的“-c”实际上是 sys.argv[1]。

Python 版本:3.7.3。

我是不是误会了什么?

【问题讨论】:

  • 你为什么不使用 Argparse docs.python.org/3/howto/argparse.html
  • 我没有使用 Python,这只是为了教育目的。试图弄清楚事情是如何运作的。似乎我的代码/设置或其他东西不在这里。我也去看看,谢谢!
  • 试试python -c "import sys; print(sys.argv)"。根据文档“启动解释器的第二种方法是python -c command [arg] ..., 它在命令中执行语句
  • @AbdulNiyasPM 啊哈明白了。您可以将此作为答案提交,我会接受。
  • sys.argv 中的第一个值始终是执行的 python 模块的名称。

标签: python python-3.x command


【解决方案1】:

那是因为-c 选项需要放在首位。

我尝试创建一个简单的脚本test.py

print('foo')

如果您运行python test.py test.py,您将只看到一个foo,这意味着第二个test.py 将被忽略。这与您的示例相同py main.py -c test

这在documentation中不是很清楚,但我认为这是精神:

2.1.1。参数传递

当解释器知道时,脚本名称和此后的附加参数将转换为字符串列表并分配给 sys 模块中的 argv 变量。您可以通过执行 import sys 来访问此列表。列表的长度至少为一个;当没有给出脚本和参数时,sys.argv[0] 是一个空字符串。当脚本名称为“-”(表示标准输入)时,sys.argv[0] 设置为“-”。使用 -c 命令时,sys.argv[0] 设置为“-c”。使用 -m 模块时,sys.argv[0] 设置为定位模块的全名。在 -c 命令或 -m 模块之后找到的选项不会被 Python 解释器的选项处理使用,而是留在 sys.argv 中以供命令或模块处理。

所以正确的用法是python -c "cmd" 而不是python file.py -c file2.py

【讨论】:

    【解决方案2】:

    启动解释器的第二种方法是 python -c command [arg] ...,它执行命令中的语句。

    -c 没有将“-c”字符串作为参数传递给程序,它正在执行命令中的语句,例如:

    python -c "import sys; print(sys.argv)"
    

    在 sys.argv 中,第一个值始终是执行的 python 模块的名称,文件名或命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2011-06-19
      • 2011-07-10
      • 2011-07-23
      相关资源
      最近更新 更多