所以,我正在尝试开发一个允许我按如下方式运行命令的脚本:
python3 rhize_refactored.py -l <str>, -sa, -si <int>, -i <input_path>, -o <output_path>
我设计了我的脚本,使得参数解析步骤是它们自己的函数,然后我在main()中调用它们。以下是这些部分的内容:
from argparse import ArgumentParser
def parse_all_args():
parser= ArgumentParser()
parser.add_argument('-sa', '--automation', action='store_true', required=True)
parser.add_argument('-si', '--sample_id', type=int, required=True)
parser.add_argument('-i', '--input_path', required=True)
parser.add_argument('-o', '--output_path', required=True)
args= parser.parse_args()
return args.automation, args.sample_id, args.input_path, args.output_path
def parse_language():
parser = ArgumentParser(prog= 'rhize_refactored.py')
parser.add_argument('-l', dest='language', choices ['bash','python'], type=str, required=True)
args= parser.parse_args()
return args.language
def r_bash():
parse_all_args()
if args.automation:
stage_automation_templates()
sample_id= args.sample_id
s3_input_path= args.input_path
s3_output_path= args.output_path`
def main():
parse_language()
if args.language == "python":
r_python()
if args.language == "bash":
r_bash()
main()
当我尝试运行此脚本时,我遇到了几个问题:
python3 rhize_refactored.py -l
,然后它说我错过了-sa, -si, etc...
个参数。但是,当我一次性完成所有论点时,它表示它不会识别过去-l
之后的论据。args=parse_all_args
,它也会出现if语句的问题,例如为'str' object has no attribute 'automation'
。我可以做些什么来纠正这些错误以及你预见到的任何其他错误?
答案 0 :(得分:0)
命令行字符串放在sys.argv
中。所有parse_args()
命令都读取该列表。你有两个解析器。两者都应该能够处理或忽略你提供的所有可能的字符串。
如果parse_language
使用args, extras = parser.parse_known_args()
,它会查找-l
,而忽略其余部分。您可能还想放弃required
,而是定义default
(2个选项中的一个)。
parse_all_args
也必须处理或忽略-l
。您可以再次使用parse_known_args
。或者您可以包含-l
参数并忽略结果。或者您可以将extras
从parse_language
传递给parser.parse_args(argv=extras)
。
正如评论中指出的那样required
store_true
没有意义。如果省略-sa
,它会抱怨;如果您加入args.automation
将True
。所以没有办法得到一个假。
当您致电parse_language
时,您需要接受返回的值,并对其执行某些操作。其他功能也一样。
def main():
language = parse_language()
if language == "python":
r_python()
if language == "bash":
r_bash()
我建议改变
def parse_all_args():
parser= ArgumentParser()
...
args= parser.parse_args()
return args
def r_bash():
args = parse_all_args()
if args.automation:
stage_automation_templates()
....
这些最后的更改只是基本的Python函数使用。