getopt()没有强制执行必需的参数?

Tyl*_*r D 12 python

我在getopt()编写的脚本中遇到了这个代码的问题,该脚本执行了一些简单的文件操作,给出了2个必需参数(输入文件名和输出文件名)和/或2个可选/情境参数(调试或帮助).

代码是:

def main(argv):
    try:
        opts, args = getopt.getopt(argv, "i:o:dh", ["input-file=", "output-file=", "debug", "help"])
    except getopt.GetoptError:
        usage()
        sys.exit(2)

    for opt, arg in opts:
        if opt in ("-h", "--help"):
            usage()
            sys.exit()
        elif opt in ("-d", "--debug"):
            global _debug
            _debug = 1
        elif opt in ("-i", "--input-file"):
            u_input_file_name = arg
        elif opt in ("-o", "--output-file"):
            u_output_file_name = arg
Run Code Online (Sandbox Code Playgroud)

根据getopt()文件:

需要参数后跟冒号的选项(' :';即,与Unix getopt()使用的格式相同).

问题是,根据我的理解,:应该根据需要强制执行a后面的变量/ args ...但是选项io没有被强制执行.运行此代码段会u_input_file_name在分配之前获取有关被引用的错误:

[tdelane@fbsd81-1 ~/python]$ ./inco_add_cm_mpscli.py -o google
Traceback (most recent call last):
  File "./inco_add_cm_mpscli.py", line 57, in <module>
    main(sys.argv[1:])
  File "./inco_add_cm_mpscli.py", line 25, in main
    infile = open(u_input_file_name, 'r')
UnboundLocalError: local variable 'u_input_file_name' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

eve*_*een 21

只有冒号的选项意味着它需要一个参数.这并不意味着强制执行该选项.您应该编写自己的代码来强制执行选项/参数.


all*_*kim 7

作为说明,我发现 argparse 比 getopt 更简单、更有用,并且它支持必需的参数。

http://docs.python.org/2/howto/argparse.html#id1

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

命令行

$ python prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
Run Code Online (Sandbox Code Playgroud)