假设我有以下脚本。
此脚本查找/ home下的最大文件,并使用10个最大的文件通过电子邮件发送输出。
./myscript.py -d /home -e joe@email.com -p 10
假设我不希望它给我发电子邮件,我删除“-e joe@email.com”脚本失败,因为它期望“-e”存在。我通过sys.arg[0] ... sys.arg[1]
等分配变量。
答案 0 :(得分:4)
使用argparse
或optparse
模块来解析您的参数,而不是自己解析它们。它允许使用可选参数,您可以指定默认值。
以下是使用optparse
的简短示例:
import optparse
parser = optparse.OptionParser()
parser.add_option("-d", "--directory", metavar="DIR",
help="Directory to scan for big files")
parser.add_option("-e", "--email", metavar='EMAIL',
help='email to send the list to')
opts, args = parser.parse_args()
print 'scanning', opts.directory
if opts.email is None:
print 'not sending the email'
答案 1 :(得分:3)
不是通过sys.arg
直接为变量分配参数,为什么不尝试使用getopt
或argparse
模块?这样做更容易,也更灵活。以下是使用argparse
的示例(来自Python 2.7的文档):
import argparse
parser = argparse.ArgumentParser(description='Sum or find the max of some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='just an integer')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum command line arguments [default action is to find the maximum]')
args = parser.parse_args() # Simple enough, right?
print args.accumulate(args.integers)
您可以使用(我们称之为args.py):
# ./args.py 1 2 3 4
4
# ./args.py 1 2 3 4 --sum
10
我甚至改变了整数参数和--sum
的顺序,但它似乎并不介意!
或者,使用getopt
:
import getopt, sys
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "hm:v", ["help", "message="])
except getopt.GetoptError, err:
print str(err) # will print an error about option not recognized..
# maybe you should print something informative about correct usage here.
sys.exit(1)
# Default option values
message = None
verbose = False
# Process cmd line options
for o, a in opts:
if o == "-v":
verbose = True
elif o in ("-h", "--help"):
usage()
sys.exit(2)
elif o in ("-m", "--message"):
message = a
else:
assert False, "unhandled option!"
'''
Do whatever you wish..
'''
if __name__ == "__main__":
main()
答案 2 :(得分:1)
对于Python-2.4,我认为optparse是解析命令行参数的推荐方法。它使用起来非常简单,它绝对比手动解析选项更好,尽管它不像Python-2.7中引入的新argparse模块那样通用。
编辑:
以下是我的某个Python程序中的(略微修改过的)optparse代码段:
options = optparse.OptionParser(description = 'Convert Foo to Bar')
options.add_option('-i', '--input', dest = 'input', action = 'store', default = '-')
options.add_option('-j', '--json', dest = 'json', action = 'store_true', default = False)
options.add_option('-m', '--mongodb', dest = 'mongodb', action = 'store', default = None)
options.add_option('-o', '--output', dest = 'output', action = 'store', default = '-')
(options, argv) = options.parse_args(sys.argv)
if options.json:
print "output: " + options.output