如何解决这个argparse freeze问题?
问题描述:
我想创建一个使用文件和目录的一个很简单的终端菜单,所以我尝试了以下内容:如何解决这个argparse freeze问题?
if __name__ == '__main__':
p = argparse.ArgumentParser(NAME)
p.add_argument('-data:', '--input_data', default=sys.stdin)
p.add_argument('-labels:', '--targets', default=sys.stdin)
p.add_argument('-input_directory:', '--input', default=sys.stdin)
p.add_argument('-output_data:', '--output', default=sys.stdout)
opts = p.parse_args()
if not any([opts.input, opts.output, opts.targets,opts.input_data]):
p.print_usage()
quit()
print '\npress -h to see the help\n'
elif any([opts.targets,opts.input_data]):
print '\ncompleted action\n'
p.print_usage()
#Recibe (datos, etiquetas)
perform_stuff(opts.input_data, opts.targets)
quit()
#Here is the problem:
elif any([opts.input, opts.output]):
print '\ncompleted action\n'
retrive(opts.input)
write(opts.output)
注意,为了简单起见,我被遗漏的perform_stuff(path/in/file, path/out/file)
,retrive(opts.input)
和write(opts.output)
实施。问题是唯一可行的命令是:
if not any([opts.input, opts.output, opts.targets,opts.input_data]):
p.print_usage()
quit()
print '\npress -h to see the help\n'
elif any([opts.targets,opts.input_data]):
print '\ncompleted action\n'
p.print_usage()
#Recibe (datos, etiquetas)
perform_stuff(opts.input_data, opts.targets)
quit()
在另一方面,当我尝试运行:
#Here is the problem:
elif any([opts.input, opts.output]):
print '\ncompleted action\n'
retrive(opts.input)
write(opts.output)
我简单的程序,只是冻结。我是新的argparse,我想这个问题与正确使用if/else语句相关。因此,我应该如何创建简单程序的菜单?
答
在这里我已经清理并压缩了您的代码,重点是让if/else树工作。
在解析器中,我将short options
重写为单个字符。我还将默认值设为None
。这使得if
测试更容易。 (如果opts.input
是stdin
并且您测试if not opts.input:
?应该怎么办?)。
import argparse
def quit():
import sys
sys.exit(1)
def perform_stuff(*args):
print 'stuff', args
def retrive(*args):
print 'retrieve', args
if __name__ == '__main__':
p = argparse.ArgumentParser()
# single letter `-d` string; use default None
p.add_argument('-d', '--input_data')
p.add_argument('-t', '--targets')
p.add_argument('-i', '--input')
p.add_argument('-o', '--output')
opts = p.parse_args()
print 'opts', opts
if not any([opts.input, opts.output, opts.targets, opts.input_data]):
p.print_usage()
print 'press -h to see the help'
quit()
elif any([opts.targets,opts.input_data]):
perform_stuff(opts.input_data, opts.targets)
quit()
elif any([opts.input, opts.output]):
retrive(opts.input, opts.output)
else:
print 'else'
样品试验:
1814:~/mypy$ python stack36877714.py
opts Namespace(input=None, input_data=None, output=None, targets=None)
usage: stack36877714.py [-h] [-d INPUT_DATA] [-t TARGETS] [-i INPUT]
[-o OUTPUT]
press -h to see the help
1815:~/mypy$ python stack36877714.py -d input_data
opts Namespace(input=None, input_data='input_data', output=None, targets=None)
stuff ('input_data', None)
1815:~/mypy$ python stack36877714.py -t targets
opts Namespace(input=None, input_data=None, output=None, targets='targets')
stuff (None, 'targets')
1815:~/mypy$ python stack36877714.py -i input
opts Namespace(input='input', input_data=None, output=None, targets=None)
retrieve ('input', None)
1816:~/mypy$ python stack36877714.py -o output
opts Namespace(input=None, input_data=None, output='output', targets=None)
retrieve (None, 'output')
你的函数可以这样写:
def retrieve(in_arg, out_arg):
if in_arg is None:
data = sys.stdin.read()
# cannot open/close stdin
else:
with open(in_arg,'r') as f:
data = f.read()
if out_arg is None:
# write to sys.stdout
else:
# write to open(out_arg,'w')
+0
感谢您的帮助,我添加了更多细节。 – tumbleweed
那么从argparse的角度看,它看起来像一切都没问题。你应该尝试调试你的程序停滞在哪里。 – ibizaman
是否有任何方法可以在每个命令之间创建更好的流程(即,如果函数被调用,完成工作,然后停止)? @ibizaman – tumbleweed
这是一个味道的问题,但那已经可以做你想做的了。我怀疑,虽然你不需要调用quit(),除非它是你的一个函数。无论哪种方式,该程序不应冻结。你可以发布你在你的函数中实现了什么,如何调用它来冻结它,以及当发生这种情况时你看到的输出? – ibizaman