如何在Python中解析命令行参数

想要使用命令行参数运行Python脚本吗?在Python中学习如何使用sys、getopt和argparse模块解析命令行参数。

在Python中,当你想要读取用户输入时,你将使用input()函数。然而,对于某些应用程序,在命令行运行脚本时,你可能希望传入一些参数。

在本教程中,我们将学习如何在命令行运行带有选项和参数的脚本。然后我们将学习如何使用Python的内置模块来解析这些选项和参数。

让我们开始吧!

了解Python中的sys.argv

如果你已经在C语言中编程过,你知道传递参数给程序的一种简单方式是通过命令行。为了做到这一点,你可以这样构造主函数:

#include

int main(int argc, char **argv){
    //argc: 参数计数
    //argv: 参数向量
    
    //在参数上做一些操作

    return 0;
}

这里,argc代表参数计数,argv代表参数向量。

使用命令行参数运行Python脚本

在Python中,你可以使用python3 文件名.py在命令行中运行Python脚本。在这样做的同时,你还可以传入任意数量的命令行参数:

$ python3 文件名.py 参数1 参数2 ... 参数n

sys模块提供了直接访问和处理这些命令行参数的支持。sys.argv是我们在运行Python脚本时传入的所有命令行参数的列表。

下面是一个我们使用命令行参数运行main.py的示例:

$ python3 main.py hello world python script

我们可以使用简单的循环遍历参数向量,如下所示:

# main.py

import sys

for idx, arg in enumerate(sys.argv):
    print(f"arg{idx}: {arg}")
# 输出
arg0:main.py
arg1:hello
arg2:world
arg3:python
arg4:script

我们可以看到,第一个参数(索引为0)是Python文件的名称。而后续的参数从索引1开始。

这是一个接受和处理命令行参数的最小工作程序。然而,我们可以看到一些问题:

  • 用户如何知道传入什么样的参数?
  • 这些参数代表什么意思?

这并不是很清楚。为了解决这个问题,你可以使用getopt或argparse模块。接下来我们将学习这个内容。✅

使用Python的getopt进行命令行参数解析

让我们学习如何使用内置的getopt模块解析命令行参数。

在从getopt模块导入getopt之后,你可以指定要解析的参数,以及使用的短选项和长选项来运行脚本。我们需要解析从sys.argv的索引1开始的所有参数。所以要解析的切片是sys.argv[1:]

在这里,我们将需要一个message字符串和file名字。让我们使用mf作为短选项,messagefile作为长选项。

但是我们如何确保特定的选项需要一个参数呢?

  • 在短选项中,你可以在短选项名称之后添加一个冒号(:)来要求一个参数。
  • 类似地,在长选项中,你可以在长选项之后添加一个=号。我们可以捕获这些选项及其相应的参数。

加入这些后,我们将在main.py中有以下代码:

# main.py

import sys
from getopt import getopt

opts, args = getopt(sys.argv[1:],'m:f:',[‘message=','file='])

print(opts)
print(args)

现在我们调用add_argument()方法在arg_parser上添加这两个参数。在add_argument()方法调用中,您可以将help设置为一个字符串(对参数的描述)。

arg_parser.add_argument('message',help='message string')
arg_parser.add_argument('file',help='filename')

到目前为止,我们已经实例化了arg_parser并添加了命令行参数。当在命令行中运行程序时,您可以使用arg_parser上的parse_args()方法来获取参数的值。

在这里,我们将参数的命名空间捕获在变量args中。因此,您可以使用args.argument_name来获取参数的值。

在获取参数的值之后,我们使用swapcase()字符串方法将message字符串的大小写交换后写入file

args = arg_parser.parse_args()

message = args.message
file = args.file

with open(file,'w') as f:
     f.write(message.swapcase())

把这些放在一起,这就是我们的main.py文件:

# main.py

from argparse import ArgumentParser

arg_parser = ArgumentParser()
arg_parser.add_argument('message',help='message string')
arg_parser.add_argument('file',help='filename')

args = arg_parser.parse_args()
print(args)

message = args.message
file = args.file

with open(file,'w') as f:
     f.write(message.swapcase())

理解命令行参数的使用

要了解在运行main.py时参数的使用方法,您可以使用--help长选项,如下所示:

$ python3 main.py --help
usage: main.py [-h] message file

positional arguments:
  message     message string
  file        filename

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

这里没有可选参数,只有messagefile是必需的位置参数。或者,您也可以使用短选项-h

$ python3 main.py -h
usage: main.py [-h] message file

positional arguments:
  message     message string
  file        filename

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

如您所见,默认情况下,这两个参数都是位置参数。因此,如果您没有传递这些参数中的一个或多个,将会遇到错误。

在这里,我们为message字符串传递了一个位置参数(Hello),但是我们没有为file参数提供任何值。

然后我们会得到一个错误,指出需要file参数。

$ python3 main.py Hello
usage: main.py [-h] message file
main.py: error: the following arguments are required: file

当我们同时传入这两个位置参数运行main.py时,我们可以看到命名空间args包含了参数的值。

$ python3 main.py Hello file1.txt
# Output
Namespace(file='file1.txt', message='Hello')

现在,如果我们查看当前工作目录的内容,我们可以看到脚本创建了文件'file1.txt':

$ ls
file1.txt  main.py

原始消息字符串是'Hello';在交换大小写后,文件'file1.txt'中的消息字符串是'hELLO'。

$ cat file1.txt
hELLO

如何使命令行参数可选

要使这些命令行参数变为可选,您可以在参数名称前加上--

让我们修改main.py以使messagefile参数可选。

# main.py

from argparse import ArgumentParser

arg_parser = ArgumentParser()
arg_parser.add_argument('--message',help='message string')
arg_parser.add_argument('--file',help='filename')

由于命令行参数都是可选的,我们可以为这些参数设置默认值。

if args.message and args.file:
    message = args.message
    file = args.file
else:
    message = 'Python3'
    file = 'myfile.txt'

此时,main.py文件包含以下代码:

# main.py

from argparse import ArgumentParser

arg_parser = ArgumentParser()
arg_parser.add_argument('--message',help='message string')
arg_parser.add_argument('--file',help='filename')

args = arg_parser.parse_args()
print(args)

if args.message and args.file:
    message = args.message
    file = args.file
else:
    message = 'Python3'
    file = 'myfile.txt'

with open(file,'w') as f:
     f.write(message.swapcase())

如果我们检查用法,我们可以看到messagefile都是可选参数。这意味着您现在可以在不使用这些参数的情况下运行main.py。

$ python3 main.py --help
usage: main.py [-h] [--message MESSAGE] [--file FILE]

optional arguments:
  -h, --help         show this help message and exit
  --message MESSAGE  message string
  --file FILE        filename
$ python3 main.py

在参数命名空间中,filemessage都为None

# Output
Namespace(file=None, message=None)

我们可以看到默认的file名称和message‘myfile.txt’和‘Python3’被使用。文件‘myfile.txt’现在位于工作目录中:

$ ls
file1.txt  main.py  myfile.txt

它包含了大小写交换的字符串‘Python3’:

$ cat myfile.txt
pYTHON3

您还可以使用--message--file参数来使命令更易读。

$ python3 main.py --message Coding --file file2.txt
# Output
Namespace(file='file2.txt', message='Coding')

我们在工作目录中看到了‘file2.txt’:

$ ls
file1.txt  file2.txt  main.py  myfile.txt

它包含了预期的字符串‘cODING’。

$ cat file2.txt
cODING

结论

以下是本教程中我们学到的内容的总结:

  • 类似于C编程语言,在Python中,您可以通过循环遍历参数向量sys.argv来访问命令行参数。sys.argv[0]是Python脚本的名称。因此,我们有兴趣解析参数sys.argv[1:]。
  • 然而,为了提高可读性并能够添加选项,您可以使用getopt和argparse模块。
  • 您可以使用getopt模块来解析从索引1开始到列表末尾的命令行参数列表。您可以指定短选项和长选项。
  • 当选项接受参数时,您可以在短选项和长选项之后分别指定冒号(:)和等号(=)。
  • 使用Python的argparse模块,您可以实例化一个ArgumentParser对象,并使用add_argument()方法添加一个必需的位置参数。在参数名之前使用–使其变为可选。
  • 要检索命令行参数的值,请在ArgumentParser对象上调用parse_args()方法。

接下来,了解如何执行secure hashing in Python

类似文章