Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在sys.args的存在下使用argparse_Python_Argparse_Sys - Fatal编程技术网

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

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 我

我想使用参数调用函数,但我感到困惑,因为我使用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\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
在添加一组选项时变得更有价值—这些值仅在默认值不适用时才需要提供,例如详细程度、输出格式、,