我在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 ...但是选项i并o没有被强制执行.运行此代码段会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)
我究竟做错了什么?
作为说明,我发现 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)