使用argparse获取python文件以基于输入参数返回不同的值

如何解决使用argparse获取python文件以基于输入参数返回不同的值

假设我有一个函数f1()

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')

您应该将每个参数t1t2与其各自的值相关联。 也只返回f1print的一个值,即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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?