2016-04-26 27 views
0

私は、ファイルやディレクトリを使用して、非常に単純な、端末のメニューを作成したいと思いますので、私は、次の試してみました:このargparseフリーズ問題を解決するにはどうすればいいですか?

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)実装をomitedこと。

#Here is the problem: 

    elif any([opts.input, opts.output]): 
     print '\ncompleted action\n' 
     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() 

:問題は作品だけコマンドがあるということです。私はargparseで新しいです、私は問題がif/else文の適切な使用と相関していると思います。したがって、私は単純なプログラムのメニューをどのように作成するのですか?

+0

、すべてが大丈夫であるように見えます。あなたのプログラムがどこに止まっているのかをデバッグしようとするべきです。 – ibizaman

+0

各コマンド間でより良いフローを作成する方法はありますか(つまり、関数が呼び出され、作業を行い、停止した場合)? @ibizaman – tumbleweed

+1

それは味の問題ですが、それはすでにあなたが望むことをするでしょう。あなたの関数の1つでない限り、quit()を呼び出す必要はありませんが、私は疑いがあります。どちらの方法でも、プログラムはフリーズするべきではありません。あなたはあなたの関数で実装したものを投稿し、それを呼び出す方法を呼び出すと、それが起こったときに表示される出力を投稿できますか? – ibizaman

答えて

1

ここでは、if/elseツリーを有効にすることに焦点を当て、コードを整理して圧縮しました。

パーサーでは、short optionsを1文字で書き換えました。私はまた、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') 

あなたの機能は次のように書くことができます:まあargparse観点から

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

関連する問題