因为平常用python命令行给不多,所以也只是知道有argparse这个库,现在遇到了看了下。实现基本的功能还是比较简单的。
argparse是python的一个用于命令行选项和参数解析的模块。本质上是用sys.argv从命令行语句中解析出命令行参数,然后自动生成帮助和使用信息。
参考官方链接:Argparse Tutorial — Python 3.9.6 documentation
导入argparse
import argparse
创建一个解析对象.
parser = argparse.ArgumentParser()
# ArgumentParser()是命令行解析的入口
向对象中添加你要关注的命令行参数
parser.add_argument()
# 可以定义命令行参数,参数的帮助信息,参数的输入类型等等
进行解析
parser.parse_args()
# 进行解析
实现功能
下面是一个简单的例子,大致为在命令行调用该test.py脚本,输入一个数字,输出该数字的平方
import argparse
# 创建解析对象,并添加描述信息
parser = argparse.ArgumentParser(description = "输出数字的平方")
# 添加命令行参数“square",还有该参数的帮助信息,参数类型
parser.add_argument("square", help="display a square of a given number", type = int)
# 进行解析
args = parser.parse_args()
# 实现功能
print(args.square**2)
使用windows+r打开cmd,输入
python test.py -h
得到如下帮助信息,-h也是命令行参数。(-h是短选项,–help是长选项,使用是一样的。):
usage: test.py [-h] square
输出数字的平方
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
帮助信息中除了描述信息外,还有两项,一项是”positional arguments“,另一项是”optional arguments“。
使用:
python command.py 配置的位置参数
例如上述平方的例子,则有
python test.py 3
输出结果为:9
python command.py 可选参数 配置的可选参数
将上面的例子更改一下
import argparse
parser = argparse.ArgumentParser(description = "输出数字的平方")
parser.add_argument('-s', "--square", help="display a square of a given number", type = int)
args = parser.parse_args()
print(args.square**2)
则命令行语句为
python test.py -s 3
或者
python test.py --square 3
一个数字的平方用命令行语句好像有点大题小作了,毕竟明明一个计算器能解决的问题为啥要费这么大的功夫?但是如果输入是一个文件,这才有点意义。
import sys
import argparse
import os.path
def main():
parser = argparse.ArgumentParser()
# 输入文件的参数
parser.add_argument('-i', "--inputFile", help = "Input file path")
# 输入数字的参数
parser.add_argument('-s', "--square",
help = "display a square of a given number", type = int)
# 输出文件的参数
parser.add_argument('-o', '--outputFile', help = "output file path")
args = parser.parse_args()
# 如果输入的是数字
if args.square:
print(args.square**2)
sys.exit(1)
# 如果输入的是文件,但是文件不存在
if args.inputFile and not os.path.isfile(args.inputFile):
sys.stderr.write('Input file {0} doesn\'t exist!\n'.
format(args.inputFile))
sys.exit(1)
# 如果输出是文件,但是文件已经存在
if args.outputFile and os.path.isfile(args.outputFile) and not args.overwrite:
sys.stderr.write('Output file {0} already exists!' .
format(args.outputFile))
sys.exit(1)
if args.outputFile:
output_fp = open(args.outputFile, 'w')
else:
output_fp = sys.stdout
# 实现功能
with open(args.inputFile, 'r') as fp:
for line in fp:
answer = int(line)**2
output_fp.write(str(answer) + '\n')
if __name__ == '__main__':
main()
然后就可以使用啦
假设输入是1.txt,里面有
1
2
3
4
5
命令行:
python test.py -i 1.txt -o 2.txt
就能得到2.txt,
1
4
9
16
25
当然,因为我们设定的是可选参数,那么我们不指定输出文件,那么输出就会显示在窗口中。当然最好是指定输出文件,这样也方便用管道。
我觉得这样命令行输入命令还不是很方便,尤其对于根本不知道命令行是什么玩意儿的外行。我们还能将命令行做成可执行文件。
这就需要用到一个库——“pyinstaller"。pyinstaller是一个第三方库,可将脚本.py文件打包为.exe可执行文件。当然这个库要自己安装一下,也很简单,直接在命令行输入
pip install pyinstaller
安装好之后将脚本文件放入一个文件夹内,打开这个文件夹,在命令行输入
pyinstaller -F test.py
等待完成之后,文件夹里有个dist文件夹,里面就有test.exe可执行文件了。
然后新建一个文档,输入
.\test.exe -i "%1" -o 2.txt
将文档另存为.bat批处理文件,就大功告成了!
随意拉一个txt文件放到.bat批处理文件上,就可以得到想要的结果了,是不是很方便!
注: 以上只是我初学argparse学到的,其实argparse.ArgumentParser()和 parser.add_argument()两个命令有很多的参数,能做到得远不止本文。