如何在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
名字。让我们使用m
和f
作为短选项,message
和file
作为长选项。
但是我们如何确保特定的选项需要一个参数呢?
- 在短选项中,你可以在短选项名称之后添加一个冒号(:)来要求一个参数。
- 类似地,在长选项中,你可以在长选项之后添加一个=号。我们可以捕获这些选项及其相应的参数。
加入这些后,我们将在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
这里没有可选参数,只有message
和file
是必需的位置参数。或者,您也可以使用短选项-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以使message
和file
参数可选。
# 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())
如果我们检查用法,我们可以看到message
和file
都是可选参数。这意味着您现在可以在不使用这些参数的情况下运行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
在参数命名空间中,file
和message
都为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。