我可以argparse用来读取不需要按特定顺序排列的命名命令行参数吗?我浏览了文档但其中大部分内容都集中在根据提供的参数显示内容(例如--h).
现在,我的脚本读取有序的,未命名的参数:
myscript.py foo-val bar-val
使用sys.argv:
foo = sys.argv[1]
bar = sys.argv[2]
Run Code Online (Sandbox Code Playgroud)
但我想更改输入,以便通过命名参数与命令无关:
myscript.py --bar = bar-val --foo = foo-val
从我自己的自定义操作中抛出ArgumentTypeError异常并让argparse为我捕获它的最佳做法是什么?
似乎argparse的try/except块不能为我的自定义操作处理此异常.虽然它对内置动作很好.
class unique_server_endpoints(argparse.Action):
"""This class avoids having two duplicate OuterIPs in the client argument list"""
def __call__(self, parser, namespace, values, option_string=None):
ips = set()
endpoints = []
for r in values:
ep = server_endpoint(r)
if ep[0] in ips:
raise argparse.ArgumentTypeError("Duplicate OuterIPs found")
else:
ips.add(ep[0])
endpoints.append(ep)
setattr(namespace, self.dest, endpoints)
Run Code Online (Sandbox Code Playgroud)
和
group.add_argument('-c', "--client", nargs = 2,
dest = "servers", action = unique_server_endpoints,
Run Code Online (Sandbox Code Playgroud)
例如,在上面的代码中,如果我有重复的IP,则异常将落入主函数并打印丑陋的堆栈跟踪.我不希望这样,我也不想在main中放置一个try/except块.
问题:我想写为用户在输入一个目录的路径add.argument的ArgumentParser()。
到目前为止:我已经写了这个
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('path', option = os.chdir(input("paste here path to biog.txt file:")), help= 'paste path to biog.txt file')
Run Code Online (Sandbox Code Playgroud)
任何想法,什么是该问题的理想解决方案?