17

sys.argvプログラムの実行時に、シェル コマンド ラインで引数を取ります。これらの引数をオプションにするにはどうすればよいですか?

try-を使用できることはわかっていますexcept。しかし、これにより、さらにネストしない限り、追加の引数を挿入しないか、すべての追加の引数を挿入する必要がtryありexceptます。これにより、コードが読みにくくなります。

編集

次の機能が必要だとします。これを実装するにはどうすればよいですか?

$ python program.py add Peter 
'Peter' was added to the list of names.

このadd引数 ( ではない--add) はオプションであるため、

$ python program.py

プログラムを正常に実行するだけです。

4

4 に答える 4

9

あなたの編集 に対処するための編集、

import sys

sys.argv = sys.argv[1:]
names = []
while sys.argv and sys.argv[0] == 'add':
    #while the list is not empty and there is a name to add
    names.append(sys.argv[1])
    print sys.argv[1], 'was added to the list of names.'
    sys.argv = sys.argv[2:]

以下のすべてがこれで動作します

$ python program.py add Peter
Peter was added to the list of names.

$ python program.py add Peter add Jane
Peter was added to the list of names.
Jane was added to the list of names.

$ python program.py

各名前の前に「追加」を要求する利点が、名前を追加した後に探したい他の引数がある場合は、それができるということです。複数の名前を渡したい場合python program.py add Peter Janeは、かなり簡単な変更でこれを行うことができます

import sys

names = []
if len(sys.argv) > 2 and sys.argv[1] == 'add':
    names = sys.argv[2:]

for n in names:
    print n, 'was added to the list of names.'

オリジナル

optparse のようなものを使用したほうがよいようです。ただしsys.argv、リストなので、長さを確認できます。

arg1 = sys.argv[1] if len(sys.argv) > 1 else 0 # replace 0 with whatever default you want
arg2 = sys.argv[2] if len(sys.argv) > 2 else 0

次に、arg1 と arg2 を「オプションの」コマンド ライン引数として使用します。これにより、1 つ、2 つ、または 0 つのコマンド ライン引数を渡すことができます (実際には、2 つ以上を渡すことができ、それらは無視されます)。-aこれはまた、引数が既知の順序を持​​っていることを前提としています。値が続くようなフラグを使用したい場合は、optparse http://docs.python.org/library/optparse.html?highlight=optparse#optparseを調べてください。

于 2012-08-07T21:13:02.527 に答える
4

placは、他の回答に記載されている標準ライブラリモジュールの代替手段です。注釈を介してコマンドライン引数を定義できます。ドキュメントから、例8はオプションの引数構文を示しています。

example8.py
def main(command: ("SQL query", 'option', 'q'), dsn):
    if command:
        print('executing %s on %s' % (command, dsn))
        # ...

if __name__ == '__main__':
    import plac; plac.call(main)

Argparseの例:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--add", help="Add prefix to string")
args = parser.parse_args()

規則では、オプションの引数は「--add」として提供され、サブコマンドは「add」として提供されることに注意してください。argparseにはサブコマンドの実装があります。

于 2012-08-08T13:13:16.183 に答える
2

getopt やargparseなどのコマンドライン パーサーを使用する必要があります。これらを使用すると、オプションでデフォルト値を持つオプションを定義できます。

于 2012-08-07T20:24:37.457 に答える
2

あなたの質問に対する簡単な答えとして、オプションの引数をsys.argvで使用できますが、モジュールが大幅に拡張することが予想される場合は、他のargparse場所で提案されているような別のモジュールを検討することをお勧めします。

これは引数を無視しませんが、その後は任意の数の引数を許可します。

#!/usr/bin/env python

import sys

added = sys.argv[1:]
if added:
    for add in added:
        print("{0} was added to the list of names.".format(add))
$ ./test.py
$ ./test.py Peter
Peter was added to the list of names.

もちろん、あなたはadd Peterただ合格しているわけではありませんPeter。しかし、それが許容できる場合、これは機能します。

私のポイントは、オプションの引数を で確実に実行できるということですsys。実際、非常に単純なスクリプトではargparse、それで十分な場合は使用する必要がないことがよくあります。

于 2020-01-30T15:01:49.503 に答える