前言
通常,使用python命令行的情况是运行某个文件,比如python hello.py
,之后会在终端上看到hello.py
文件的输出结果。但如果每次运行py文件时,需要对其中的某些变量赋值,比如我想运行一个py文件,做一个简单的加法运算:python sum.py 1 2
,希望得到结果为3。
sys.argv
应该如何来编写可以接受从命令行进行赋值的加法脚本?
一种可行的代码如下:
import sys
args = sys.argv
print(sum(map(int,args[1:])))
sys.argv
的值是python后面的所有值组成的一个列表,上面的例子中,args =['sum.py', '1','2']
,所以这个例子还可以接受更多的参数,比如python sum.py 1 2 3 4 5 6,结果为21。
通过这种方式可以自定义python的命令行,不过这篇文章的主角不是sys.argv
,接下来看看更炫酷的python命令行吧!
argparse
使用python sum.py 1 2 3 4 5 6
运行下列代码可以得到与上述代码相同的结果
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('integers', metavar='int', nargs='+', type=int, help='一个整数')
args = parser.parse_args()
print(sum(args.integers))
正常情况下,结果是一样的,但argparse可以提供更多的信息。如果输入错误,会得到详细的错误信息:
输入python sum.py -h
可以得到详细的帮助信息:
接下来试试写一个命令行版本的简易计算器,支持加减乘除:
from functools import reduce
import argparse
parser = argparse.ArgumentParser(description='一个简易计算器,支持加减乘除')
parser.add_argument('integers', nargs='+', type=int, help='一个整数')
parser.add_argument('-a','--add',help='加法')
parser.add_argument('-s','--subtract',help='减法')
parser.add_argument('-m','--multiply',help='乘法')
parser.add_argument('-d','--divide',help='除法')
def add(args):
print(sum(args))
def substract(args):
print(reduce(lambda x,y:x-y, args))
def multiply(args):
print(reduce(lambda x,y:x*y, args))
def divide(args):
print(reduce(lambda x,y:x/y, args))
args = parser.parse_args()
if args.subtract:
substract(args.integers)
elif args.multiply:
multiply(args)
elif args.divide:
divide(args)
else:
add(args)
这样一个简单的计算器就搞定了。简单介绍一下里面用到的参数:
nargs='+'
表示参数个数为2个或以上,*表示任意个,默认为1个参数;
'-a','--add',help='加法'
表示缩写为a,完整格式为add,显示帮助信息为“加法”;
type=int
表示将数据转换为int,没有此属性时默认为str。
进阶
官方文档中有比较详细的解释。接下来是搬运内容:
Argparse 教程
作者
Tshepang Lekhonkhobe
这篇教程旨在作为 argparse
的入门介绍,此模块是 Python 标准库中推荐的命令行解析模块。
注解 还有另外两个模块可以完成同样的任务,称为 getopt
(对应于 C 语言中的 getopt()
函数) 和被弃用的 optparse
。还要注意 argparse
是基于 optparse
的,因此用法与其非常相似。
概念
让我们利用 ls 命令来展示我们将要在这篇入门教程中探索的功能:
$ ls
cpython devguide prog.py pypy rm-unused-function.patch
$ ls pypy
ctypes_configure demo dotviewer include lib_pypy lib-python ...
$ ls -l
total 20
drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython
drwxr-xr-x 4 wena wena 4096 Feb 8 12:04 devguide
-rwxr-xr-x 1 wena wena 535 Feb 19 00:05 prog.py
drwxr-xr-x 14 wena wena 4096 Feb 7 00:59 pypy
-rw-r--r-- 1 wena wena 741 Feb 18 01:01 rm-unused-function.patch
$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
...
我们可以从这四个命令中学到几个概念:
ls 是一个即使在运行的时候没有提供任何选项,也非常有用的命令。在默认情况下他会输出当前文件夹包含的文件和文件夹。
如果我们想要使用比它默认提供的更多功能,我们需要告诉该命令更多信息。在这个例子里,我们想要查看一个不同的目录,pypy。我们所做的是指定所谓的位置参数。之所以这样命名,是因为程序应该如何处理该参数值,完全取决于它在命令行出现的位置。更能体现这个概念的命令如 cp,它最基本的用法是 cp SRC DEST
。第一个位置参数指的是你想要复制的,第二个位置参数指的是你想要复制到的位置。
现在假设我们想要改变这个程序的行为。在我们的例子中,我们不仅仅只是输出每个文件的文件名,还输出了更多信息。在这个例子中,-l 被称为可选参数。
这是一段帮助文档的文字。它是非常有用的,因为当你遇到一个你从未使用过的程序时,你可以通过阅读它的帮助文档来弄清楚它是如何运行的。
基础
让我们从一个简单到(几乎)什么也做不了的例子开始:
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
以下是该代码的运行结果:
$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h]
options:
-h, --help show this help message and exit
$ python3 prog.py --ve