如何解决这个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语句相关。因此,我应该如何创建简单程序的菜单?

+0

那么从argparse的角度看,它看起来像一切都没问题。你应该尝试调试你的程序停滞在哪里。 – ibizaman

+0

是否有任何方法可以在每个命令之间创建更好的流程(即,如果函数被调用,完成工作,然后停止)? @ibizaman – tumbleweed

+1

这是一个味道的问题,但那已经可以做你想做的了。我怀疑,虽然你不需要调用quit(),除非它是你的一个函数。无论哪种方式,该程序不应冻结。你可以发布你在你的函数中实现了什么,如何调用它来冻结它,以及当发生这种情况时你看到的输出? – ibizaman

在这里我已经清理并压缩了您的代码,重点是让if/else树工作。

在解析器中,我将short options重写为单个字符。我还将默认值设为None。这使得if测试更容易。 (如果opts.inputstdin并且您测试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