如何解决使用argparse获取python文件以基于输入参数返回不同的值
def f1(input1,input2):
# does some magic
return p1,p2
if __name__ == "__main__":
parser = ArgumentParser(description='Help function description')
parser.add_argument('t1',help='Token')
parser.add_argument('t2',help='Another token')
args = parser.parse_args()
p1,p2 = f1(args.t1,args.t2)
比方说,此文件名为street.py。我想使用相同的文件在参数arg1为输入时返回p1,在参数arg2为输入时返回p2。 文件外:
variable1 = (python3 ../street.py t1 t2 -arg1)
variable2 = (python3 ../street.py t1 t2 -arg2)
我对文档中的argparse参数风格有些困惑,最简单的方法是什么?
解决方法
您可以使用以下方法解决问题:
parser.add_argument('-arg1','--argument1',action='store_true')
args = parser.parse_args()
如果您调用True
,它将args.argument1
存储在变量python3 ../street.py t1 t2 -arg1
中,以便以后可以使用简单的if / elif语句来分隔不同的情况,即:>
if args.argument1 is True:
print(p1)
,
TL; DR
在这样的终端(linux)中拨打电话
variable=$(python3 streep.py t1 'foo' t2 'bar')
您应该将每个参数t1
和t2
与其各自的值相关联。
也只返回f1
到print
的一个值,即stdout
您应该考虑您想要的行为。如果要使用f1
的输出,请在其参数中明确指出什么是强制性的,什么是可选的输入。
还要考虑一下您想要的输出是什么,因为这是一个脚本,值将通过stdout
传递,因此您到print
的一行只有一行。
def f1(input1,input2):
# does some magic
return p1 or p2
然后只需使用python print()
语句将结果打印到stdout
基于您的代码的示例可能像
from argparse import ArgumentParser
import sys
def f1(input1,input2):
# does some magic
return input1 or input2
if __name__ == "__main__":
parser = ArgumentParser(description='Help function description')
parser.add_argument('--t1',help='Token')
parser.add_argument('--t2',help='Another token')
args = parser.parse_args()
try:
result = f1(args.t1,args.t2)
print(result)
except Exception as e:
print(e,file=sys.stderr)
exit(1)
然后我可以将该脚本用作
variable=$(python3 streep.py --t2 'bar')
,
使用此文件:
import argparse,sys
def f1(input1,input2):
# does some magic
print('inside f1')
return input1,input2
if __name__ == "__main__":
print(sys.argv)
parser = argparse.ArgumentParser(description='Help function description')
parser.add_argument('t1',help='Token')
parser.add_argument('t2',help='Another token')
args = parser.parse_args()
print(args)
p1,p2 = f1(args.t1,args.t2)
print(p1,p2)
寻求帮助(在shell窗口中):
201:~/mypy$ python3 stack64684099.py -h foo bar
['stack64684099.py','-h','foo','bar']
usage: stack64684099.py [-h] t1 t2
Help function description
positional arguments:
t1 Token
t2 Another token
optional arguments:
-h,--help show this help message and exit
使用帮助中指定的2个参数运行:
1201:~/mypy$ python3 stack64684099.py foo bar
['stack64684099.py','bar']
Namespace(t1='foo',t2='bar')
inside f1
foo bar
我添加了打印内容,以向sys.argv
显示argparse从外壳获取的字符串列表。以及解析产生的namespace
和运行f1
的结果。
===
我不知道你在哪里:
variable1 = (python3 ../street.py t1 t2 -arg1)
variable2 = (python3 ../street.py t1 t2 -arg2)
您的parser
设置中没有任何东西可以寻找或关注那些'-arg1','-arg2'字符串。在您的问题中,他们应该做的事情还不清楚。
我可以将stdout
重定向到文件:
1202:~/mypy$ python3 stack64684099.py foo bar > test.txt
1208:~/mypy$ cat test.txt
['stack64684099.py',t2='bar')
inside f1
foo bar
除最后一个打印外,全部省略,仅给出foo bar
行。
parser
的主要目的是阅读和理解/解析用户输入。如果您对args
命名空间中的结果感到满意,则其余的取决于您自己的代码。按照定义,您的参数是简单的字符串,您可以按原样使用它们或测试某些值。您还可以产生数字,并使用正确的action
布尔值。您还可以定义optionals
,这些参数需要flag
字符串,例如--arg1
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。