web-dev-qa-db-ja.com

Pythonでコマンドライン引数を処理するにはどうすればよいですか?

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

...最初の1つ-複数の「数値」引数があるため。第二に-理由は...まあ、予期しない引数; 3番目と4番目-3桁以外の引数のため。

26
user63503

他の人が答えたように、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'

[〜#〜] edit [〜#〜]: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()を呼び出すことで、新しいオプションを簡単に追加できます

31
Van Gale

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

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

15
John Fouhy

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

2
regan

実際のコマンドラインスイッチを実装する場合は、 getopt を確認してください。使い方も非常に簡単です。

2
sli

Van Galeは、引数に対して正規表現を使用することはほぼ正しいです。ただし、optparseを使用するときにすべてをオプションにする必要はありません。これは、「-」または「-」が前にあるかどうかに基づいて、sys.argvをオプションと引数に分割します。引数だけを通過するコードの例:

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の詳細については、 relevant Python doc をご覧ください。

0
PTBNL