我有一个接受文件作为输入的程序,对文件的内容进行一些处理,然后将其推送到服务器。我想添加一个可选的命令行开关来指定程序的“空运行”,由此它完成所有文件处理,但跳过向服务器写入。我正在使用 argparse 引入命令行参数,但我看不到在参数之间执行“或”函数的方法。这就是我或多或少正在寻找的东西......
允许的选项:
1) prog.py 输入文件服务器名
2) prog.py 输入文件-d
3) prog.py inputfile -d 服务器名
不允许:
1) prog.py 输入文件
我想确保服务器名称“或”试运行标志在命令行上。而且,如果两者都存在……那也没关系。 (因此是 OR 而不是 XOR)。如果我使用 required=true 互斥,我可以获得异或;但是,我似乎无法弄清楚如何在两者都存在的情况下将其作为“或”来执行。使事情复杂化的是,服务器名称是一个位置参数,试运行标志是一个可选参数,可以位于命令行的任何位置。有没有人知道如何实现这一点?
最佳答案
这是我会做的:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-d', '--dry-run', action='store_true')
parser.add_argument('input_file', type=argparse.FileType('r'))
parser.add_argument('servername', nargs='?')
args = parser.parse_args()
if args.servername is None and not args.dry_run:
parser.error("Option 'servername' is required when not in dry-run mode.")
print args
例子:
$ ./prog.py inputfile servername
Namespace(dry_run=False, input_file=<open file 'inputfile', mode 'r' at 0x283440>, servername='servername')
$ ./prog.py inputfile -d
Namespace(dry_run=True, input_file=<open file 'inputfile', mode 'r' at 0x2cf440>, servername=None)
$ ./prog.py -d inputfile servername
Namespace(dry_run=True, input_file=<open file 'inputfile', mode 'r' at 0x1f4440>, servername='servername')
$ ./prog.py inputfile
usage: prog.py [-h] [-d] input_file [servername]
prog.py: error: Option 'servername' is required when not in dry-run mode.
您也可以使用自定义操作来执行此操作,它具有相同的效果:
class ServernameAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
if values is None and not namespace.dry_run:
parser.error("Option 'servername' is required when not in dry-run mode.")
setattr(namespace, self.dest, values)
...
parser.add_argument('servername', nargs='?', action=ServernameAction)
...
关于python - 或在 Python 的命令行上使用带有两个变量的 argparse 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12536217/