如何在 Python 中处理命令行参数?
Posted
技术标签:
【中文标题】如何在 Python 中处理命令行参数?【英文标题】:How can I process command line arguments in Python? 【发布时间】:2010-10-08 17:56:31 【问题描述】:如果我期望 001 或 999 之类的值(这次我们将期望值限制在 001...999 范围内),并且通过的其他参数很少,并且希望忽略任何意外?
我知道如果我需要找出是否在参数之间传递了“调试”,它会是这样的:
if 'debug' in argv[1:]:
print 'Will be running in debug mode.'
如何判断009或575是否通过?
所有这些都是预期的调用:
python script.py
python script.py 011
python script.py 256 debug
python script.py 391 xls
python script.py 999 debug pdf
此时我不在乎这样的电话:
python script.py 001 002 245 568
python script.py some unexpected argument
python script.py 0001
python script.py 02
...第一个 - 因为不止一个“数字”参数;第二——因为……嗯,出乎意料的争论;第三和第四 - 因为非 3 位参数。
【问题讨论】:
看看这个***.com/questions/25605380/… 【参考方案1】:正如其他人回答的那样,optparse 是最好的选择,但如果您只想快速编写代码,请尝试以下操作:
import sys, re
first_re = re.compile(r'^\d3$')
if len(sys.argv) > 1:
if first_re.match(sys.argv[1]):
print "Primary argument is : ", sys.argv[1]
else:
raise ValueError("First argument should be ...")
args = sys.argv[2:]
else:
args = ()
# ... anywhere in code ...
if 'debug' in args:
print 'debug flag'
if 'xls' in args:
print 'xls flag'
编辑:这是一个 optparse 示例,因为很多人在回答 optparse 时并没有真正解释原因,也没有解释您必须进行哪些更改才能使其正常工作。
使用 optparse 的主要原因是它为您以后的扩展提供了更大的灵活性,并在命令行上为您提供了更多的灵活性。换句话说,您的选项可以按任何顺序出现,并且会自动生成使用消息。但是,要使其与 optparse 一起使用,您需要更改规范以将“-”或“--”放在可选参数的前面,并且您需要允许所有参数按任意顺序排列。
下面是一个使用 optparse 的示例:
import sys, re, optparse
first_re = re.compile(r'^\d3$')
parser = optparse.OptionParser()
parser.set_defaults(debug=False,xls=False)
parser.add_option('--debug', action='store_true', dest='debug')
parser.add_option('--xls', action='store_true', dest='xls')
(options, args) = parser.parse_args()
if len(args) == 1:
if first_re.match(args[0]):
print "Primary argument is : ", args[0]
else:
raise ValueError("First argument should be ...")
elif len(args) > 1:
raise ValueError("Too many command line arguments")
if options.debug:
print 'debug flag'
if options.xls:
print 'xls flag'
optparse 和您的规范的区别在于,现在您可以使用如下命令行:
python script.py --debug --xls 001
您可以通过调用 parser.add_option() 轻松添加新选项
【讨论】:
但请注意:optparse 已“自 [Python] 2.7 版以来已弃用:optparse 模块已弃用,不会进一步开发;开发将继续使用 argparse 模块。”见:docs.python.org/2/library/optparse.html【参考方案2】:看看optparse 模块。自己处理 sys.argv 对于非常简单的事情来说很好,但很快就会失控。
请注意,如果您可以稍微更改参数格式,您可能会发现 optparse 更易于使用;例如将debug
替换为--debug
,将xls
替换为--xls
或--output=xls
。
【讨论】:
当 OP 只使用参数而不是选项时,我不确定这是否值得。 请注意 optparse 已被替换为 argparse【参考方案3】:optparse 是你解析命令行的好朋友。另请查看argparse;不过,它不在标准库中。
【讨论】:
正如注释argparse 现在是 Python 2.7 的标准,甚至似乎已移植到 2.6.8。根据optparse documentation,optparse 现在已被弃用。【参考方案4】:如果你想实现实际的命令行开关,给getopt 看看。它的使用也非常简单。
【讨论】:
我不会说 getopt 就这么简单 - 当然,它比手动解析要好,但它只是一些 C 代码的一个端口,并没有真正利用 Python 的优势。我几乎总是推荐 optparse 而不是 getopt。【参考方案5】:Van Gale 在对参数使用正则表达式时在很大程度上是正确的。但是,在使用 optparse 时,并非绝对需要将所有内容都设为选项,它将 sys.argv 拆分为选项和参数,具体取决于前面是否有“-”或“--”。一些仅通过参数的示例代码:
import sys
import optparse
claParser = optparse.OptionParser()
claParser.add_option(
(opts, args) = claParser.parse_args()
if (len(args) >= 1):
print "Arguments:"
for arg in args:
print " " + arg
else:
print "No arguments"
sys.exit(0)
是的,args 数组的解析方式与 sys.argv 的解析方式非常相似,但添加了在需要时轻松添加选项的功能。有关 optparse 的更多信息,请查看relevant Python doc。
【讨论】:
以上是关于如何在 Python 中处理命令行参数?的主要内容,如果未能解决你的问题,请参考以下文章