Python命令行参数示例

时间:2020-01-09 10:43:06  来源:igfitidea点击:

在Python中,想通过shell args传递输入,如下所示:

./myscript.py filename 
./myscript.py in.file output.file 
./myscript.py -i in.file -o output.file 

如何在Linux或者类似Unix的操作系统下使用Python传递和解析命令行选项和参数?

了解命令行参数

Python提供了以下两个选项:

  • getopt模块是用于命令行选项的解析器,其API设计为C getopt()函数的用户熟悉。
  • argparse模块使编写用户友好的命令行界面变得容易,我建议所有用户使用此模块。

根据提供给该命令的命令行参数,大多数Unix和Linux命令可以采取不同的操作。

什么是命令行参数?

命令行参数不过是发送给被调用程序的参数。
程序可以使用任意数量的命令行参数。
例如,执行以下命令:cat/etc/passwdcat是实际命令的名称,当您在shell提示符下执行command时,shell将执行此命令。
命令行上的第一个单词是:

  • 要执行的命令的猫名称。
  • 命令行上的其他所有内容均作为该命令的参数。
  • 传递给ls命令的命令行参数总数(包括命令名称本身)为2。

考虑以下示例:ls --sort = size foo.txt bar.txt其中,

  • ls:命令名称。
  • --sort = size foo.txt bar.txt:参数。
  • 3:参数总数。

尝试以下命令,并记下其命令行参数:

lsls0
ls/etc/resolv.confls1/etc/resolv.conf
grep --color root/etc/passwdgrep2color,root,/etc/passwd

getopt模块

语法为:

import sys
 
# get argument list using sys module
sys.argv

例子

使用以下代码显示传递给demo.py的参数总数:

#!/usr/bin/python
# demo.py - CMD Args Demo By theitroad
import sys
 
# Get the total number of args passed to the demo.py
total = len(sys.argv)
 
# Get the arguments list 
cmdargs = str(sys.argv)
 
# Print it
print ("The total numbers of args passed to the script: %d " % total)
print ("Args list: %s " % cmdargs)

保存并关闭文件。
如下运行:

$ python demo.py input.txt output.txt

或者

$ chmod +x demo.py
$ ./demo.py input.txt output.txt

输出示例:

The total numbers of args passed to the script: 3 
Args list: ['demo.py', 'input.txt', 'output.txt']

解析命令行参数(选项和参数)

编辑文件demo.py并进行如下更新:

#!/usr/bin/python
__author__ = 'theitroad'
import sys
 
total = len(sys.argv)
cmdargs = str(sys.argv)
print ("The total numbers of args passed to the script: %d " % total)
print ("Args list: %s " % cmdargs)
# Pharsing args one by one 
print ("Script name: %s" % str(sys.argv[0]))
print ("First argument: %s" % str(sys.argv[1]))
print ("Second argument: %s" % str(sys.argv[2]))

保存并关闭文件。
如下运行:

$ ./demo.py input.txt output.txt

输出示例:

The total numbers of args passed to the script: 3 
Args list: ['./demo.py', 'input.txt', 'output.txt'] 
Script name: ./demo.py
First argument: input.txt
Second argument: output.txt

尝试运行相同的程序,如下所示:

$ ./demo.py -i input.txt -o output.txt

输出示例:

The total numbers of args passed to the script: 5 
Args list: ['./demo.py', '-i', 'input.txt', '-o', 'output.txt'] 
Script name: ./demo.py
First argument: -i
Second argument: input.txt

该脚本仅输出前三个参数,而跳过其余参数。
输出不正确。
此外,如何将诸如-i或者-o之类的选项与传递给各个选项的参数(如input.txt或者output.txt)分开?
您可以使用以下代码解决此问题:

#!/usr/bin/python
__author__ = 'theitroad'
import sys
 
total = len(sys.argv)
cmdargs = str(sys.argv)
print ("The total numbers of args passed to the script: %d " % total)
print ("Args list: %s " % cmdargs)
print ("Script name: %s" % str(sys.argv[0]))
for i in xrange(total):
    print ("Argument # %d : %s" % (i, str(sys.argv[i])))

输出示例:

$ ./demo.py -i input.txt -o output.txt
The total numbers of args passed to the script: 5 
Args list: ['./demo.py', '-i', 'input.txt', '-o', 'output.txt'] 
Script name: ./demo.py
Argument # 0 : ./demo.py
Argument # 1 : -i
Argument # 2 : input.txt
Argument # 3 : -o
Argument # 4 : output.txt

但是,我不建议使用for循环和短语参数方法。
它包含在此处仅用于演示和历史目的。
正确和推荐的Python语法如下:

#!/usr/bin/python
__author__ = 'theitroad'
import sys, getopt
# Store input and output file names
ifile=''
ofile=''
 
# Read command line args
myopts, args = getopt.getopt(sys.argv[1:],"i:o:")
 
###############################
# o == option
# a == argument passed to the o
###############################
for o, a in myopts:
    if o == '-i':
        ifile=a
    elif o == '-o':
        ofile=a
    else:
        print("Usage: %s -i input -o output" % sys.argv[0])
 
# Display input and output file name passed as the args
print ("Input file : %s and output file: %s" % (ifile,ofile) )

如下运行:

$ ./demo.py -i foo.txt -o bar.txt
Input file : foo.txt and output file: bar.txt
$ ./demo.py -o bar.txt -i foo.txt
Input file : foo.txt and output file: bar.txt
$ ./demo.py -o bar.txt 
Input file :  and output file: bar.txt
$ ./demo.py 
Input file :  and output file:

创建使用情况消息

更新后的代码如下:

#!/usr/bin/python
__author__ = 'Hyman'
import sys, getopt
 
ifile=''
ofile=''
 
###############################
# o == option
# a == argument passed to the o
###############################
# Cache an error with try..except 
# Note: options is the string of option letters that the script wants to recognize, with 
# options that require an argument followed by a colon (':') i.e. -i fileName
#
try:
    myopts, args = getopt.getopt(sys.argv[1:],"i:o:")
except getopt.GetoptError as e:
    print (str(e))
    print("Usage: %s -i input -o output" % sys.argv[0])
    sys.exit(2)
 
for o, a in myopts:
    if o == '-i':
        ifile=a
    elif o == '-o':
        ofile=a
 
# Display input and output file name passed as the args
print ("Input file : %s and output file: %s" % (ifile,ofile) )

如下运行:

$ ./demo.py -i input.txt -o output.txt
Input file : input.txt and output file: output.txt
$ ./demo.py -i input.txt -o output.txt -z
option -z not recognized
$ ./demo.py -i input.txt -o
option -o requires argument
Usage: ./demo.py -i input -o output

argparse模块

argparse模块可帮助您以更少的代码以及更多有用的帮助和错误消息来编写相同的逻辑。
语法为:

警告!这些示例需要Python 2.7及更高版本。

import argparse
parser = argparse.ArgumentParser(description='ADD YOUR DESCRIPTION HERE')
parser.add_argument('-i','--input', help='Input file name',required=True)
args = parser.parse_args()
## do something with args

例子

创建一个名为demo1.py的文件:

#!/usr/bin/python
import argparse
__author__ = 'theitroad'
 
parser = argparse.ArgumentParser(description='This is a demo script by theitroad.')
parser.add_argument('-i','--input', help='Input file name',required=True)
parser.add_argument('-o','--output',help='Output file name', required=True)
args = parser.parse_args()
 
## show values ##
print ("Input file: %s" % args.input )
print ("Output file: %s" % args.output )

保存并关闭文件。
如下运行:

$ chmod +x demo1.py
$ ./demo1.py 
usage: demo1.py [-h] -i INPUT -o OUTPUT
demo1.py: error: argument -i/--input is required
$ ./demo1.py -h
usage: demo1.py [-h] -i INPUT -o OUTPUT

This is a demo script by theitroad.

optional arguments:
  -h, --help            show this help message and exit
  -i INPUT, --input INPUT
                        Input file name
  -o OUTPUT, --output OUTPUT
                        Output file name
$ ./demo1.py -i input.txt -o output.txt
Input file: input.txt
Output file: output.txt
$ ./demo1.py -i input.txt 
usage: demo1.py [-h] -i INPUT -o OUTPUT
demo1.py: error: argument -o/--output is required
$ ./demo1.py -i input.txt -o output.txt -z
usage: demo1.py [-h] -i INPUT -o OUTPUT
demo1.py: error: unrecognized arguments: -z
$ ./demo1.py --input input.txt --output output.txt 
Input file: input.txt
Output file: output.txt