2012-02-25 16 views
9
from sys import argv 
script, lira_cbt, [eur_hedge] = argv 

if eur_hedge == None: 
    #Do x 
else: 
    #Do y 

lira_cbtを引数として(xを実行する)、またはlira_cbtとeur_hedge(yを実行する)の両方で実行できるようにします。これはsys.argvで実現できますか?sys.argvはオプションの引数を扱うことができますか?

+1

あなたのCLIは、その複雑取得した場合(あなたには、いくつかの古いバージョンで立ち往生している場合や 'optparse')、あなたはおそらく' argparse'を使用して開始する必要があります。 – delnan

答えて

15

ちょうど別のオプションはtryを使用してargvリストから値を抽出することであるsys.argv

if len(sys.argv) == 2: 
    # do X 
else: 
    # do Y 
2

sys.argvの長さを確認できます。

if len(sys.argv) < 2: 
    # Error, not enough arguments 

lira_cbt = sys.argv[1] 
if len(sys.argv) == 2: 
    # Do X 
else: 
    eur_hedge = sys.argv[2] 
    # Do Y 
+0

しかし、eur_hedgeの値を具体的に引き出すことは、引数を展開するために必要以上に多くの変数を必要としないで行うことはできません。 – Felix

+2

いいえ、それを関数呼び出しに変換し、 'def main(script、lira_cbt、eur_hedge = None)'や 'main(* sys.argv)'のようなものを使用しない限り、これを行う方法はありません。私は間違いないでしょう。 –

1

の長さを使用します。

lira_cbt = sys.argv[1] 
try: 
    eur_hedge = sys.argv[2] 
except IndexError: 
    eur_hedge = None 

if eur_hedge == None: 
    # Do X 
else: 
    # Do Y 

あなたはまたのためにgetoptを見て取ることができますコマンドライン引数のより柔軟なパーサー。

+2

optparseまたはargparseはgetoptよりはるかに優れています! – carl

5

これは使い捨てのスクリプトよりの一部であることがある場合、それははるかに複雑になりますが、それはあなたがあなたのプログラムが受け入れるオプションを文書化保つのを助ける現時点​​でhttp://docs.python.org/library/argparse.html

argparse使用することを検討し、 「解凍する値が多すぎます」とは違って、ユーザーが理解できない有用なエラーメッセージも表示されます。

0

私は別のアプローチを提案することができる場合は、次の

from sys import argv 
option_handle_list = ['--script', '--lira_cbt', '--eur_hedge'] 
options = {} 
for option_handle in option_handle_list: 
    options[option_handle[2:]] = argv[argv.index(option_handle) + 1] if option_handle in argv else None 
if options['eur_hedge'] == None: 
    #Do x 
else: 
    #Do y 
+0

これはうまくいくかもしれませんが、このタスクのために 'argparse'のようなモジュールを使うのは、もっと簡単で楽しくなるでしょう。 – YSelf

+0

@自分自身私はより簡単な/より伝統的な解決策について議論していません。元の質問に答えるだけです。 –

関連する問題