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

Posted

技术标签:

【中文标题】如何在 sys.argv 存在的情况下使用 argparse【英文标题】:How can I use argparse with the existance of sys.args 【发布时间】:2019-07-03 23:20:58 【问题描述】:

我想使用参数调用函数,但我很困惑,因为我使用 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 感到困惑。

谢谢!

【问题讨论】:

***.com/questions/27529610/… 定义一个带有 3 个位置参数的 argparse 很容易,其用法类似于“python myscript.py cmd 输入输出”。 args 命名空间将有 3 个属性,与 sys.argv[1:] 的 3 个元素基本相同。链接 SO 的重点是如何用choices 约束cmd 属性,并将其转换为函数调用(带有函数映射)。 【参考方案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]]()

【讨论】:

是的,我也为此创建了两个单独的脚本,但也想了解如何在单个脚本中执行此操作。感谢您的回答,让我试试吧! 您的解决方案完美运行!但只是为了了解我如何使用定义的参数来代替运行具有 1、2 参数的函数。 @Captain-Robot 我添加了另一个可能更适合您的情况的选项。如果有帮助请务必采纳! 谢谢,@Tomothy32。这是完美的!如果你不介意我问的话,我只有一个问题。为什么你更喜欢使用 sys.argv 运行函数,为什么不使用 argparse? @Captain-Robot 对于更复杂的东西,一定要使用argparse。但是,这种情况非常简单,因此不需要。有一种方法可以使用argparse 来完成此操作,但这只是复杂且不必要的。【参考方案2】:

这是一个使用 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 字符串到函数的委派使用某种映射。

【讨论】:

argparse 在您添加一堆可选项时变得更有价值 - 只有在默认值不适用时才需要提供的值,例如详细程度、输出格式,

以上是关于如何在 sys.argv 存在的情况下使用 argparse的主要内容,如果未能解决你的问题,请参考以下文章

argparse:“sys.argv[1]”和“args.input”有啥区别?

如何在 pytest 中使用 sys.argv 为函数创建多个测试

[JAVA/PYTHON] Command Line Argument | String[] args | sys.argv

python中的sys.argv有啥用?print sys.argv啥意思?

Python 脚本在 Windows 中不使用 sys.argv

[JAVA/PYTHON] Command Line Argument | String[] args | sys.argv