我有一个名为program.py的程序,并且我正在使用argparse进行参数解析。
我有两种运行以下二进制文件的方式:
1)模拟,不需要参数
2)非模拟,需要很多参数
我希望程序接受
python program --simulation
要么
python program arg1 arg2 arg3 arg4
需要所有“参数”的地方。
我认为做到这一点的唯一方法是在所有字段中添加“ required = False”并手动检查逻辑,但是我想知道是否还有更优雅的方法。
这是我的代码的简化版本
def get_args():
parser = argparse.ArgumentParser(description = "program")
parser.add_argument("arg1", type = bool)
parser.add_argument("arg2" ,type = str)
parser.add_argument("arg3", type = int)
parser.add_argument("arg4", type = str)
parser.add_argument("--simulation")
args = parser.parse_args()
return args
最佳答案
argparse
不能那么聪明。但是,在简单的情况下,您可以“帮助”它选择正确的选项来进行解析:
def get_args(args=sys.argv[1:]):
parser = argparse.ArgumentParser(description = "program")
if args and args[0].startswith("--"):
parser.add_argument("--simulation")
else:
parser.add_argument("arg1", type = bool)
parser.add_argument("arg2" ,type = str)
parser.add_argument("arg3", type = int)
parser.add_argument("arg4", type = str)
args = parser.parse_args(args=args)
return args
所以
print(get_args("--simulation xx".split()))
产生:Namespace(simulation='xx')
因为第一个参数以
--
开头。其他任何选项都无法按预期进行命令行解析。和
print(get_args("True foo 3 bar".split()))
产量:Namespace(arg1=True, arg2='foo', arg3=3, arg4='bar')
忘记4个位置参数之一,命令行解析将无法按预期进行。
顺便说一句,我添加了一个默认参数,如果忽略该参数,将从系统参数中读取(就像您的代码中所做的一样)。另外,您可以从文本文件中读取并传递args令牌。因此,测试和创建可以使用其他模块的参数调用的模块更容易,而无需通过
sys.argv
进行修改。