Python 如何在sys.args的存在下使用argparse
我想使用参数调用函数,但我感到困惑,因为我使用Sys.arg[1]和Sys.arg[2]的两个参数作为文件输入输出函数 我的脚本作为Python 如何在sys.args的存在下使用argparse,python,argparse,sys,Python,Argparse,Sys,我想使用参数调用函数,但我感到困惑,因为我使用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 我
$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\u file
和out\u file
执行不同的任务!现在,我想从命令行参数调用这些函数
$python script.py runfuction1 inputfile.txt outputfile.txt
$python script.py runfuction2 inputfile.txt outputfile.txt
import argparse
import sys
input_file = sys.argv[1]
out_file = sys.argv[2]
def fuction1():
#Stuff
def fucntion2():
#Stuff
我尝试过其他帖子中的一些解决方案,比如帖子编号中的问题: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
。尝试:
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:]
如果
cmd
字符串不在已批准的列表中,则使用choices
进行操作。它添加了一个帮助
显示。从cmd
字符串到函数的委托使用某种映射。下面是一个使用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:]
如果
cmd
字符串不在已批准的列表中,则使用choices
进行操作。它添加了一个帮助
显示。从cmd
string到function的委托使用了某种映射。是的,我也为此创建了两个sperate脚本,但我想了解如何在单个脚本中也这样做。谢谢你的回答让我试试吧!您的解决方案非常有效!但为了学习如何使用已定义的参数来代替使用1,2参数运行函数。@Captain Robot我添加了另一个可能更适合您情况的选项。如果答案有帮助,请务必接受!谢谢,@Tomothy32。太完美了!如果你不介意我问的话,我只有一个问题。为什么您喜欢使用sys.argv运行函数,为什么不使用argparse?@Captain Robot对于更复杂的内容,一定要使用argparse
。但是,这种情况非常简单,因此不需要。有一种方法可以通过argparse
来实现这一点,但它非常复杂而且不必要。是的,我也为此创建了两个sperate脚本,但我想学习如何在单个脚本中实现这一点。谢谢你的回答让我试试吧!您的解决方案非常有效!但为了学习如何使用已定义的参数来代替使用1,2参数运行函数。@Captain Robot我添加了另一个可能更适合您情况的选项。如果答案有帮助,请务必接受!谢谢,@Tomothy32。太完美了!如果你不介意我问的话,我只有一个问题。为什么您喜欢使用sys.argv运行函数,为什么不使用argparse?@Captain Robot对于更复杂的内容,一定要使用argparse
。但是,这种情况非常简单,因此不需要。有一种方法可以通过argparse
来实现这一点,但它非常复杂而且不必要。定义一个argparse
非常简单,它包含3个位置参数,用法类似于“python myscript.py cmd input-output”。args
名称空间将有3个属性,基本上与sys.argv[1://code>的3个元素相同。链接SO的重点是如何使用choices
约束cmd
属性,并将其转换为函数调用(使用函数映射)。很容易定义一个带有3个位置参数的argparse
,其用法类似于“python myscript.py cmd input-output”。args
名称空间将有3个属性,基本上与sys.argv[1://code>的3个元素相同。链接SO的重点是如何使用choices
约束cmd
属性,并将其转换为函数调用(使用函数映射)。argparse
在添加一组选项时变得更有价值-只有在默认值不适用时才需要提供这些值,例如详细程度、输出格式、,argparse
在添加一组选项时变得更有价值—这些值仅在默认值不适用时才需要提供,例如详细程度、输出格式、,