30

Python プログラムへの入力として 2 つの整数のリストを渡したいです。

たとえば、(コマンドラインから)

python test.py --a 1 2 3 4 5 -b 1 2  

このリストの整数の範囲は 1 ~ 50 です。List 2 は List1 のサブセットです。
ヘルプ/提案はありますか? argparse正しいモジュールですか? それを使用する上で懸念はありますか?

私が試してみました :

import argparse
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--a', help='Enter list 1 ')
    parser.add_argument('--b', help='Enter list 2 ')
    args = parser.parse_args()
    print (args.a)
4

6 に答える 6

11

リストに変換するよりも文字列として渡すことができます。argparseまたはoptparseを使用できます。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--l1', type=str)
parser.add_argument('--l2', type=str)
args = parser.parse_args()
l1_list = args.l1.split(',') # ['1','2','3','4']

例:python prog.py --l1=1,2,3,4

また、この 1-50 のようなものを行として渡し、「-」で分割して範囲を構築することもできます。このようなもの:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--l1', type=str, help="two numbers separated by a hyphen")
parser.add_argument('--l2', type=str)
args = parser.parse_args()
l1_list_range = xrange(*args.l1.split('-')) # xrange(1,50)
for i in l1_list_range:
    print i

例:python prog.py --l1=1-50

ロジックは自分で書けると思います。:)

于 2013-03-17T11:00:41.140 に答える
1

コマンドラインから引数を読み取る方法はoptparseargparse引数は空白で分割されるため、optparseまたはからコマンドラインインターフェイスを介して整数のリストを入力する場合argparseは、スペースを削除するか、または引数を で囲みます"。例:

> my_script.py --a "1 2 3 4 5" --b "1 2"

また:

> my_script.py --a 1,2,3,4,5 --b  1,2

次に、スクリプトでこれらの入力を実際のリストに変換する必要があります。

構文の使用argparse( に非常に似ていますoptparse):

# with spaces and "
a_lst = [i for i in args.a.split(' ')] 
b_lst = [i for i in args.b.split(' ')]

# without spaces and ,
a_lst = [i for i in args.a.split(',')] 
b_lst = [i for i in args.b.split(',')]

これを行う別の方法は、実行したいモジュールをインポートしてリスト オブジェクトをコードを処理するクラスに渡すか、while ループとraw_input/を使用しinputて目的のリストを収集することです。

于 2013-03-17T11:25:02.397 に答える
1

唯一の引数がリストと区切り記号である場合は、比較的簡単に実行できます。

sa = sys.argv.index('-a')
sb = sys.argv.index('-b')
lista = [int(i) for i in sys.argv[sa+1:sb]]
listb = [int(i) for i in sys.argv[sb+1:]]

検証を追加するのは簡単です:

aval = [i for i in lista if i>1 and i<50]
if len(aval) < len(lista):
    print 'The -a list contains invalid numbers.'
bval = [i for i in listb if i>1 and i<50]
if len(bval) < len(listb):
    print 'The -b list contains invalid numbers.'

ヘルプ メッセージの生成:

if sys.argv[1] in ['-h', '-H'] or len(sys.argv) == 1:
    print "Usage: <name> -a [list of integers] -b [list of integers]"
于 2013-03-17T11:25:06.787 に答える