5

コマンドラインからargparseに渡されるオプションの引数の順序を取得する方法を知りたい

回転、トリミング、サイズ変更など、さまざまなアクションを画像に適用できる画像処理クラスがあります...

そして、これらのアクションが適用される順序はしばしば重要です (たとえば、サイズを変更する前に画像をトリミングしたい場合など)。

私はこのコードを持っています:

parser = argparse.ArgumentParser(description='Image processing arguments')

parser.add_argument('source_file', help='source file')
parser.add_argument('target_file', help='target file')

parser.add_argument('-resize', nargs=2, help='resize image', metavar=('WIDTH', 'HEIGHT'))
parser.add_argument('-rotate', nargs=1, help='rotate image', metavar='ANGLE')
parser.add_argument('-crop', nargs=4, help='crop image', metavar=('START_X','START_Y','WIDTH','HEIGHT'))

ar = parser.parse_args()

print ar

しかし - どの順序でパラメータをスクリプトに渡しても:

cmd.py test.jpg test2.jpg -クロップ 10 10 200 200 -サイズ変更 450 300

cmd.py test.jpg test2.jpg -サイズ変更 450 300 -クロップ 10 10 200 200

名前空間内の項目は常に同じ順序になっています (アルファベット順だと思います):

Namespace(crop=['10', '10', '200', '200'], resize=['450', '300'], rotate=None, source_file='test.jpg', target_file='test
2.jpg')

コマンドライン文字列の位置で並べ替える方法や、インデックスを取得する方法はありますか?

4

4 に答える 4

5

いつでもsys.argvリストがどれであるか(したがって順序付けられているか)を確認し、それを繰り返して、どの引数が最初に来るかを確認するか、を使用list.index()してリスト内のキーワードのそれぞれの位置を確認できます...

sys.argvコマンドラインに入力された単語のリストが含まれます(このような「単語」の区切り文字は、文字列が引用符で囲まれていない限りスペースです)。これは、ユーザーが次のようなものを入力した場合、次のような./my_proggie -resize 500リストsys.argvが含まれることを意味します['./my_proggie', '-resize', '500']

于 2011-10-12T09:20:35.463 に答える
3

Namespace は単純なオブジェクトであり、str()その属性は、その .xml 内のキーの順序に従ってリストされます__dict__。で属性を設定しsetattr(namespace, dest, value)ます。

1 つの解決策は、カスタム Namespace クラスを定義することです。例えば:

class OrderNamespace(argparse.Namespace):
    def __init__(self, **kwargs):
        self.__dict__['order'] = []
        super(OrderNamespace, self).__init__(**kwargs)
    def __setattr__(self,attr,value):
        self.__dict__['order'].append(attr)
        super(OrderNamespace, self).__setattr__(attr, value)

と使用

args = parser.parse_args(None, OrderNamespace())

あなたの2つの例を作成する

OrderNamespace(crop=..., order=[..., 'crop', 'resize'], resize=...)
OrderNamespace(crop=..., order=[..., 'resize', 'crop'], resize=...)

このorder属性は、他の属性が設定される順序を示します。初期項目は、デフォルトとファイル位置指定用です。引数に追加default=argparse.SUPPRESSすると、これらの項目の一部が抑制されます。このカスタム クラスは、たとえば OrderedDictionary を使用して、選択した引数の順序のみを記録したりorder、属性の表示を制御するために使用したりして、より複雑にすることができます。

order別のオプションは、この属性を作成するカスタム Action クラスを使用することです。

class OrderAction(argparse._StoreAction):
    def __call__(self, parser, namespace, values, option_string=None):
        setattr(namespace, self.dest, values)
        order = getattr(namespace, 'order') if hasattr(namespace, 'order') else []
        order.append(self.dest)
        setattr(namespace, 'order', order)
于 2013-07-25T20:31:44.580 に答える