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/passwd
cat是实际命令的名称,当您在shell提示符下执行command时,shell将执行此命令。
命令行上的第一个单词是:
- 要执行的命令的猫名称。
- 命令行上的其他所有内容均作为该命令的参数。
- 传递给ls命令的命令行参数总数(包括命令名称本身)为2。
考虑以下示例:ls --sort = size foo.txt bar.txt
其中,
- ls:命令名称。
--sort = size foo.txt bar.txt
:参数。3
:参数总数。
尝试以下命令,并记下其命令行参数:
ls | ls | 0 | 无 |
ls/etc/resolv.conf | ls | 1 | /etc/resolv.conf |
grep --color root/etc/passwd | grep | 2 | color,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