我如何在 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_file
和 out_file
来完成不同的任务!现在,我想从命令行参数调用这些函数
$ python script.py runfuction1 inputfile.txt outputfile.txt
$ python script.py runfuction2 inputfile.txt outputfile.txt
我尝试了其他 post 的一些解决方案,例如 post 编号中的问题: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
像这样需要 3 个位置参数 argparse
并没有比查看
更高级的解析
cmd, input, output = sys.argv[1:]
对于 choices
,如果 cmd
字符串不在批准列表中,它会反对。它添加了一个 help
显示。从 cmd
字符串到函数的委派使用某种映射。
我想使用参数调用函数,但我很困惑,因为我使用 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_file
和 out_file
来完成不同的任务!现在,我想从命令行参数调用这些函数
$ python script.py runfuction1 inputfile.txt outputfile.txt
$ python script.py runfuction2 inputfile.txt outputfile.txt
我尝试了其他 post 的一些解决方案,例如 post 编号中的问题: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
像这样需要 3 个位置参数 argparse
并没有比查看
cmd, input, output = sys.argv[1:]
对于 choices
,如果 cmd
字符串不在批准列表中,它会反对。它添加了一个 help
显示。从 cmd
字符串到函数的委派使用某种映射。