真正的原因是当你不带参数运行脚本时, opts, args = getopt.getopt(sys.argv[1:], "hi:n:o:s:d:")这句得到的opts = [], 即一个空的list且并不像楼上说的会报异常错误, 而对于一个空的list来说, 你这句for op,value in opts:是不会进入到for循环中去的, 自然也不会触发else的逻辑。
我们做个测试:
lst = []
for i in lst:
if i:
print(i)
else:
print("hello")
# 结果为空, for循环并没有执行
lst = [0]
for i in lst:
if i:
print(i)
else:
print("hello")
# 列表非空, 可迭代, 正常进入else
所以你这代码应该改写为:
# coding=utf8
import getopt
import sys
def usage():
print("{}: '-i p_case_dir -n p_case_id_str -o p_out_dir -s p_src_conn -d p_dst_conn'".format(sys.argv[0]))
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "hi:n:o:s:d:")
except getopt.GetoptError as e:
print(e)
usage()
sys.exit(1)
if opts:
for op, value in opts:
if (op == "-i"):
p_case_dir = value
elif (op == "-n"):
p_case_id_str = value
elif (op == "-o"):
p_out_dir = value
elif (op == "-s"):
p_src_conn = value
elif (op == "-d"):
p_dst_conn = value
else:
usage()
sys.exit(1)
else:
usage()
sys.exit(1)
if __name__ == "__main__":
main()
另外从Python 2.7开始, 更为灵活方便的argparse被纳入标准库, 所以建议用来代替getopt
官网manual