如何在 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 中处理命令行参数?的主要内容,如果未能解决你的问题,请参考以下文章

Python3之命令行参数处理

在 Python 中以前缀表示法处理命令行参数

Python命令行参数处理之argparse模块

python的命令行参数处理

Python 命令行参数和getopt模块详解

如何在 Python 3 中传递命令行参数