我按照https://docs.python.org/2/library/getopt.html上的示例来解析命令行选项。我几乎是python的新手。像示例我的代码是:
import getopt, sys
import pdb
config_filename = 'config.py'
orders_filename = 'default.out'
db_filename = 'sqlite.db'
action = False
def main():
c_args_parse()
print action
def c_args_parse():
pdb.set_trace()
try:
(opts, args) = getopt.getopt(sys.argv[1:], "hc:d:o:s:")
except getopt.GetoptError as err:
# print help information and exit:
print '\n' + str(err) # will print something like "option -a not recognized"
usage()
sys.exit(2)
for o, a in opts:
if o in ("-h", "--help"):
usage()
exit()
elif o in ("-c", "--config"):
config_filename = a
elif o in ("-d", "--db"):
db_filename = a
elif o in ("-o", "--output"):
orders_filename = a
elif o in ("-s", "--sync"):
action = a
else:
assert False, "\nUnhandled option"
if not action:
print '\nSpecifying a sync action is required'
usage()
sys.exit(2)
def usage():
usage = """
BESync [hcdo] -s orders|products|availablity
-h --help Prints this help
-c --config (arg) Path to config file
-d --db (arg) Path to sqlite db
-o --output (arg) Path to orders output file (arg)
-s --sync (arg) Actions (arg): orders, products, availability
"""
print usage
if __name__ == "__main__":
main()
在for循环中,变量 a 似乎为空,而元组 (o,a) 是细
运行pdb trace:
$ python test.py -s orders
test.py(16)c_args_parse()
-> try:
(Pdb) n
> ./test.py(17)c_args_parse()
-> (opts, args) = getopt.getopt(sys.argv[1:], "hc:d:o:s:")
(Pdb)
> ./test.py(24)c_args_parse()
-> for o, a in opts:
(Pdb)
> ./test.py(25)c_args_parse()
-> if o in ("-h", "--help"):
(Pdb) o,a
('-s', 'orders')
(Pdb) o
'-s'
(Pdb) a
# returns nothing
对此有何解释?
答案 0 :(得分:1)
在这里从臀部射击 - 但实际上并没有让自己变得困难。使用http://docopt.org/进行选项解析。我的代码中看不到任何明显错误,但这可能只是我。我有空的时候会跑它; - )
(编辑)看起来动作正在被遮蔽。我通常更喜欢更实用的样式(让c_args_parse返回东西,而不是设置全局变量)的原因之一是我懒得深入研究我使用的关于阴影的各种语言的规则。将“全局操作”添加到函数的顶部,它现在可以工作(并且同样适用于您设置的其他变量)。仍然 - 考虑返回东西,使用全局变量并不是很好的风格。
答案 1 :(得分:1)
a
没有按照您的想法行事。 a
是debugger command,它将参数打印到当前函数。
尝试p a
打印表达式a
的值。