繁体   English   中英

如何在sys.args存在的情况下使用argparse

[英]How can I use argparse with the existance of sys.args

我想使用参数调用这些函数,但是我感到困惑,因为我正在使用Sys.arg [1]和Sys.arg [2]的两个参数作为文件输入输出函数。

我的脚本用作$ python script.py inputfile.txt outputfile.txt

import argparse
import sys

input_file = sys.argv[1]
out_file = sys.argv[2]

def fuction1():
    #Stuff

def fucntion2():
    #Stuff

我在这两个函数中都使用input_fileout_file来完成不同的任务! 现在,我想从命令行参数调用这些函数,例如$ python script.py runfuction1 inputfile.txt outputfile.txt $ python script.py runfuction2 inputfile.txt outputfile.txt

我已经尝试了其他帖子中的一些解决方案,例如帖子编号中的问题: 27529610但是它不起作用,我对同时使用系统参数和argparse感到困惑。

谢谢!

为此,您不需要argparse 尝试:

import sys

to_run = int(sys.argv[1][-1])
input_file = sys.argv[2]
out_file = sys.argv[3]

def function1():
    # Stuff
    pass

def function2():
    # Stuff
    pass

(function1, function2)[to_run - 1]()

更好的是,您可以只创建两个单独的脚本!

您还可以使用字典,该字典更加灵活:

import sys

input_file = sys.argv[2]
out_file = sys.argv[3]

def function1():
    # Stuff
    pass

def function2():
    # Stuff
    pass

funcs = {'runfunction1': function1, 'runfunction2': function2}    
funcs[sys.argv[1]]()

这是使用argparse和3个位置参数的版本:

import argparse
import sys

def function1(input, output):
    print(f'1: {input} to {output}')

def function2(input, output):
    print(f'2: {input} to {output}')

adict = {'runfunction1': function1, 'runfunction2': function2}

parser = argparse.ArgumentParser()
parser.add_argument('cmd', choices=adict)
parser.add_argument('input')
parser.add_argument('output')

args = parser.parse_args()
print(sys.argv[1:])
print(args)
adict[args.cmd](args.input, args.output)

一些示例运行:

1445:~/mypy$ python3 stack54614049.py -h
usage: stack54614049.py [-h] {runfunction1,runfunction2} input output

positional arguments:
  {runfunction1,runfunction2}
  input
  output

optional arguments:
  -h, --help            show this help message and exit

1445:~/mypy$ python3 stack54614049.py 
usage: stack54614049.py [-h] {runfunction1,runfunction2} input output
stack54614049.py: error: the following arguments are required: cmd, input, output

1446:~/mypy$ python3 stack54614049.py foo
usage: stack54614049.py [-h] {runfunction1,runfunction2} input output
stack54614049.py: error: argument cmd: invalid choice: 'foo' (choose from 'runfunction1', 'runfunction2')

1446:~/mypy$ python3 stack54614049.py runfunction1 in out
['runfunction1', 'in', 'out']
Namespace(cmd='runfunction1', input='in', output='out')
1: in to out

1446:~/mypy$ python3 stack54614049.py runfunction2 in out
['runfunction2', 'in', 'out']
Namespace(cmd='runfunction2', input='in', output='out')
2: in to out

像这样的argparse具有3个必需的位置参数,它的解析能力远不及看

cmd, input, output = sys.argv[1:]

如果cmd字符串不在批准的列表中,则使用该choices将产生反对。 它添加了一个help显示。 cmd字符串到函数的委派使用某种映射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM