Python命令行脚本:两种使用场景,如何实现参数解析?

1 投票
3 回答
786 浏览
提问于 2025-04-17 08:39

我有一个Python命令行脚本,可以用两种不同的方式来运行。

第一种情况是这样的:

script.py -max MAX -min MIN -delta DELTA

在这里,-max-min是必须提供的参数,而-delta是可选的。

第二种情况是:

script.py some_file.txt -f

在这里,some_file.txt是必须提供的位置参数,而-f是可选的。

我该如何使用任何Python命令行参数解析器(比如argparse、optparse、getopt等)来实现这个功能呢?

更新:这个脚本只做一件事——抓取一个网站。但这个过程需要很长时间。在第一种情况下,我们启动一个新的抓取会话,而在第二种情况下,我们加载之前保存的会话并继续抓取。

3 个回答

0

如果你使用 argparse 而不是 optparse,你可以通过不在字母前面加 '-' 来区分必需的参数和可选的参数。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('min', help="min value for function")
parser.add_argument('max', help="max value for function")
parser.add_argument('-d','--delta', type=int, help="the delta value")
args = parser.parse_args()

print args

这样我就可以这样运行:

$ argtest.py -d 10 5 20
Namespace(delta=10, max='20', min='5')
2

这两种情况看起来差别挺大的,我会倾向于写两个不同的脚本。如果它们有一些共同的代码,可以把这些代码放到一个单独的模块里,然后在每个脚本中引入这个模块。

如果你想用一个脚本,那为什么不试试用一个子解析器呢?这样你可以运行你的脚本,并明确告诉它你想要哪个场景,比如:

script.py calc -max MAX -min MIN -delta DELTA

或者

script.py read some_file.txt -f

(这里的'calc'和'read'当然可以用你想要的任何名字来替代这两个功能。)

6

我会这样做:

parser = OptionParser()
parser.add_option("-max", dest="max")
parser.add_option("-min", dest="min")
parser.add_option("-delta", dest="delta")
parser.add_option("-f", dest="f_thing", action="store_true")

(options,args) = parser.parse_args()

if not args:
    if not options.max or not options.min:
        parser.error("Please provide a max and min value.")
    else:
        yourfunction(options, args) # without some_file.txt name
else:
        yourfunctions(options, args) # pass the some_file.txt name

我不确定这是不是你想要的100%答案,但我觉得这个问题有点相似。这可以给你一些思路,帮助你实现你的目标。

撰写回答