如果我可以将您的问题改写为答案,您需要一个脚本,当它运行时:
-
script blah 将blah 视为要打开的文件名
-
script --file blah 将blah 视为要打开的文件名
-
script --file blah eggs 将blah 视为要打开的文件名,而eggs ... 如何?
-
script blah eggs 对待 blah ... 不同吗?怎么样?
无论如何,我还是从 argparse 开始:
#! /usr/bin/env python
import argparse
parser = argparse.ArgumentParser(description='script to morgle blahs')
parser.add_argument('--file', help='specify file name to be opened')
parser.add_argument('args', metavar='FILE', nargs='*')
args = parser.parse_args()
print args
此时运行./script.py -h 会产生:
usage: script.py [-h] [--file FILE] [FILE [FILE ...]]
script to morgle blahs
positional arguments:
FILE
optional arguments:
-h, --help show this help message and exit
--file FILE specify file name to be opened
额外的运行:
$ ./script.py
Namespace(args=[], file=None)
$ ./script.py blah
Namespace(args=['blah'], file=None)
$ ./script.py --file blah eggs
Namespace(args=['eggs'], file='blah')
$ ./script.py blah eggs
Namespace(args=['blah', 'eggs'], file=None)
所以,现在您可以测试args.file 是否为None(不是--file),而不是简单的print args,然后检查args.args,如果args.file 是不是 None,您仍然可以查看args.args。
如果在某个时候,您在自己的代码中确定某些参数组合是错误/无效的,您可以调用 parser.error,例如:
if args.file is not None and len(args.args) > 0:
parser.error('use [--file] <filename>, not --file <filename1> <filename2>')
if args.file is None and len(args.args) != 1:
parser.error('use [--file] <filename>')
只需要一个参数,无论前面是否有 --file 字符串。