現在、.py スクリプトには 2 つの関数があります。
#1 はデータベースに接続し、何らかの処理を行います。
#2は、ファイルに対して他の処理を行います
現在、スクリプトを実行する前に、メインのif ステートメント ブロックで実行する関数を手動でコメント/コメント解除する必要があります。
argparse を使用して、スクリプトを実行するときにどの関数を実行するかを尋ねられるようにするにはどうすればよいですか?
ArgumentParser オブジェクトに、目的の動作をする関数またはオブジェクトについて直接、呼び出しでaction='store_const'
とのconst=<stuff>
ペアを使用してadd_argument()
、または呼び出しを使用して伝えることができset_defaults()
ます (後者は、サブパーサーを使用している場合に最も役立ちます)。parsed_args
これを行うと、グローバル名前空間で検索する代わりに、解析から返されたオブジェクトで関数を検索できます。
ちょっとした例として:
import argparse
def foo(parsed_args):
print "woop is {0!r}".format(getattr(parsed_args, 'woop'))
def bar(parsed_args):
print "moop is {0!r}".format(getattr(parsed_args, 'moop'))
parser = argparse.ArgumentParser()
parser.add_argument('--foo', dest='action', action='store_const', const=foo)
parser.add_argument('--bar', dest='action', action='store_const', const=bar)
parser.add_argument('--woop')
parser.add_argument('--moop')
parsed_args = parser.parse_args()
if parsed_args.action is None:
parser.parse_args(['-h'])
parsed_args.action(parsed_args)
そして、次のように呼び出すことができます:
% python /tmp/junk.py --foo
woop is None
% python /tmp/junk.py --foo --woop 8 --moop 17
woop is '8'
% python /tmp/junk.py --bar --woop 8 --moop 17
moop is '17'
実行AまたはBのフラグにすぎない場合は、単純な「store_true」引数で十分です。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--run_a_not_b', action='store_true')
_StoreTrueAction(option_strings=['--run_a_not_b'], dest='run_a_not_b', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('--run_a_not_b')
>>> parsed_args = parser.parse_args('--run_a_not_b'.split())
>>> if parsed_args.run_a_not_b:
print "run a"
else:
print "run b"
run a
>>> parsed_args = parser.parse_args(''.split())
>>> if parsed_args.run_a_not_b:
print "run a"
else:
print "run b"
run b
または、呼び出す関数の名前を実際に渡したい場合は、次のように(ややハックっぽい)方法で行うことができます。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--func_to_run', type=str)
_StoreAction(option_strings=['--func_to_run'], dest='func_to_run', nargs=None, const=None, default=None, type=<type 'str'>, choices=None, help=None, metavar=None)
>>> parsed_args = parser.parse_args('--func_to_run my_other_func'.split())
>>> parsed_args.func_to_run
'my_other_func'
>>> f = globals()[parsed_args.func_to_run]
<function my_other_func at 0x011F6670>
>>> f()
編集:整数引数を処理するには、タイプを指定するだけです
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--run_a_not_b', action='store_true')
>>> parser.add_argument('--func_arg', type=int)
>>> parsed_args = parser.parse_args('--run_a_not_b --arg 42'.split())
>>> parsed_args = parser.parse_args('--run_a_not_b --func_arg 42'.split())
>>> parsed_args
Namespace(func_arg=42, run_a_not_b=True)
したがって、parsed_args.func_arg
この例で選択した場合は、単純に値を取得できます。
これにはファブリックの使用を検討してください。