如何检查命令行参数是否已设置?

59

我可以这样调用我的脚本:

python D:\myscript.py 60

在脚本中,我可以这样做:

arg = sys.argv[1]
foo(arg)

但是我该如何测试命令行调用中是否输入了参数?我需要像这样做:

if isset(sys.argv[1]):
    foo(sys.argv[1])
else:
    print "You must set argument!!!"

检查 argv[1] 是否为空,抱歉,我认为我讲的是关于第一个参数的。 - Jim
1
@Jim sys.argv 不为空,至少包含脚本的名称作为 sys.argv[0] - khachik
9个回答

73
import sys
len( sys.argv ) > 1

65

不要使用sys.argv来处理命令行界面,有一个模块可以完成这个任务:argparse

你可以通过将required=True传递给add_argument来将参数标记为必需的。

import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument("foo", ..., required=True)
parser.parse_args()

20
如果需求非常简单,使用 sys.argv 有什么问题吗? - Jonik
1
@Jonik,不一定,但很少有理由不使用它。就像正则表达式偶尔用于解析HTML一样,但很少有理由不使用HTML解析器。 - Katriel
4
提供一个在Richard的情况下无法使用的示例会得到-1分。 如果foo60,那么它将成为一个位置参数,您不能向位置参数添加required=True - geedoubleya

30
if len(sys.argv) < 2:
    print "You must set argument!!!"

8
if len(sys.argv) == 1:
   print('no arguments passed')
   sys.exit()

这将检查是否传递了任何参数。如果没有参数,它将退出脚本,而不运行其余部分。


谢谢你的回答!请注意,已经有其他非常类似的答案了。 - bohrax

6

如果你在使用Python 2.7/3.2版本,使用argparse模块。否则,请使用optparse模块。该模块将负责解析命令行,并可检查位置参数的数量是否符合预期。


2
这段脚本使用了 IndexError 异常:
try:
    print(sys.argv[1])
except IndexError:
    print("Empty argument")

2
for arg in sys.argv:
    print (arg)  
    #print cli arguments

您可以使用它将参数存储在列表中并使用它们。这比像这样使用它们更安全sys.argv[n]

如果没有给出参数,则没有问题


0

我使用optparse模块进行此操作,但我猜测因为我使用的是2.5版本,所以如果您使用2.7或更高版本,可以像Alex建议的那样使用argparse。


-10

if(sys.argv[1]):应该可以正常工作,如果没有参数,sys.argv[1]将会(应该)为空。


3
如果那个值没有被设定,那将会导致列表索引越界错误。 - GWW
它将由于IndexError而崩溃。 - khachik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接