web-dev-qa-db-ja.com

sys.argv以外のargsでpython argparseを使用するには?

私はすべてのドキュメントを見てきましたが、それを行う方法はないようですが、次のようになります。

Sys.argvだけでなく、文字列のリストでargparseを使用する方法はありますか?

これが私の問題です。次のようなプログラムがあります。

# This file is program1.py
import argparse

def main(argv):
    parser = argparse.ArgumentParser()
    # Do some argument parsing

if __name__ == '__main__':
    main(sys.argv)

これは、このプログラムがコマンドラインから直接呼び出された場合に正常に機能します。ただし、別のpythonスクリプトがあり、このスクリプトのバッチバージョンをさまざまなコマンドライン引数で実行します。次のように使用しています。

import program1

arguments = ['arg1', 'arg2', 'arg3']
program1.main(arguments)

引数を解析できるようにしたいのですが、argparseはデフォルトで、指定した引数の代わりにsys.argvを使用します。 sys.argvを使用する代わりに引数リストを渡す方法はありますか?

19
ClydeTheGhost

文字列のリストをparse_argsに渡すことができます。

parser.parse_args(['--foo', 'FOO'])
13
iCart

スクリプトをデフォルトのsys.argv[1:]に変更し、最初の引数(呼び出されたコマンドの名前)を省略して引数を解析します

import argparse,sys

def main(argv=sys.argv[1:]):
    parser = argparse.ArgumentParser()
    # Do some argument parsing
    args = parser.parse_args(argv)

if __name__ == '__main__':
    main()

または、最初の引数を省略できない場合:

import argparse,sys

def main(args=None):
    # if None passed, uses sys.argv[1:], else use custom args
    parser = argparse.ArgumentParser()
    parser.add_argument("--level", type=int)
    args = parser.parse_args(args)

    # Do some argument parsing

if __name__ == '__main__':
    main()

最後の1つ:呼び出されたプログラムを変更できない場合でも、何かを行うことができます

変更できないプログラムがargtest.pyであるとしましょう(引数を表示するための呼び出しを追加しました)

次に、argtest.sysモジュールのローカルargv値を変更します。

import argtest
argtest.sys.argv=["dummy","foo","bar"]
argtest.main()

出力:

['dummy', 'foo', 'bar']