29

001 や 999 のようなものを期待し (今回は期待値を 001...999 の範囲に制限しましょう)、その他の引数がほとんど渡されず、予期しないものを無視したい場合、コマンドライン引数を処理する簡単な式は何でしょうか? ?

たとえば、「デバッグ」がパラメーター間で渡されたかどうかを確認する必要があるかどうかは理解しています。次のようになります。

if 'debug' in argv[1:]:
  print 'Will be running in debug mode.'

009 または 575 が渡されたかどうかを調べる方法は?

これらはすべて予想される呼び出しです。

python script.py
python script.py 011
python script.py 256 debug
python script.py 391 xls
python script.py 999 debug pdf

現時点では、次のような呼び出しは気にしません。

python script.py 001 002 245 568
python script.py some unexpected argument
python script.py 0001
python script.py 02

...最初のもの - 複数の「数値」引数のため。2番目-理由...まあ、予期しない引数。3 番目と 4 番目 - 引数が 3 桁でないため。

4

5 に答える 5

32

他の人が答えたように、optparse が最良のオプションですが、簡単なコードが必要な場合は、次のようなものを試してください。

import sys, re

first_re = re.compile(r'^\d{3}$')

if len(sys.argv) > 1:

    if first_re.match(sys.argv[1]):
        print "Primary argument is : ", sys.argv[1]
    else:
        raise ValueError("First argument should be ...")

    args = sys.argv[2:]

else:

    args = ()

# ... anywhere in code ...

if 'debug' in args:
    print 'debug flag'

if 'xls' in args:
    print 'xls flag'

編集: これは optparse の例です。非常に多くの人が optparse に答えており、理由を説明したり、機能させるために何を変更する必要があるかを説明したりしていません。

optparse を使用する主な理由は、後で展開する際の柔軟性が向上し、コマンド ラインの柔軟性が向上することです。つまり、オプションは任意の順序で表示でき、使用法メッセージは自動的に生成されます。ただし、optparse で動作させるには、仕様を変更して、オプションの引数の前に「-」または「--」を配置する必要があり、すべての引数を任意の順序で指定できるようにする必要があります。

以下は、optparse を使用した例です。

import sys, re, optparse

first_re = re.compile(r'^\d{3}$')

parser = optparse.OptionParser()
parser.set_defaults(debug=False,xls=False)
parser.add_option('--debug', action='store_true', dest='debug')
parser.add_option('--xls', action='store_true', dest='xls')
(options, args) = parser.parse_args()

if len(args) == 1:
    if first_re.match(args[0]):
        print "Primary argument is : ", args[0]
    else:
        raise ValueError("First argument should be ...")
elif len(args) > 1:
    raise ValueError("Too many command line arguments")

if options.debug:
    print 'debug flag'

if options.xls:
    print 'xls flag'

ここでの optparse と仕様の違いは、次のようなコマンド ラインを使用できるようになったことです。

python script.py --debug --xls 001

parser.add_option() を呼び出すことで、新しいオプションを簡単に追加できます。

于 2009-02-20T01:02:40.420 に答える
16

optparseモジュールを見てください。sys.argv を自分で処理するのは、非常に単純なことであれば問題ありませんが、すぐに手に負えなくなります。

引数の形式を少し変更できると、optparse が使いやすくなることに注意してください。debugたとえば、--debugandxls--xlsorに置き換え--output=xlsます。

于 2009-02-20T00:51:36.873 に答える
2

実際のコマンド ライン スイッチを実装する場合は、getoptを参照してください。使い方も驚くほど簡単です。

于 2009-02-20T01:55:06.970 に答える
2

optparseは、コマンド ラインを解析するための最良の友です。argparseも調べてください。ただし、標準ライブラリにはありません。

于 2009-02-20T00:54:06.087 に答える
0

Van Gale は、引数に対して正規表現を使用する点でおおむね正しいです。ただし、「-」または「--」が前にあるかどうかに基づいて、sys.argv をオプションと引数に分割する optparse を使用する場合は、すべてをオプションにする必要はありません。引数だけを実行するコード例:

import sys
import optparse

claParser = optparse.OptionParser()
claParser.add_option(
(opts, args) = claParser.parse_args()
if (len(args) >= 1):
  print "Arguments:"
  for arg in args:
    print "  " + arg
else:
  print "No arguments"
sys.exit(0)

はい、args 配列は sys.argv とほぼ同じ方法で解析されますが、必要に応じてオプションを簡単に追加できる機能が追加されています。optparse の詳細については、 関連する Python docを確認してください。

于 2009-02-20T05:02:44.397 に答える