簡體   English   中英

使用argparse在我的腳本中運行2個函數中的1個

[英]Use argparse to run 1 of 2 functions in my script

我的.py腳本中目前有2個函數。

#1連接到數據庫並進行一些處理。

#2對文件進行其他處理

當前,在運行腳本之前,我必須手動注釋/取消注釋要在 if語句塊中運行的功能。

如何使用argparse,因此在運行腳本時會問我要運行哪個函數?

可以通過add_argument()調用中的action='store_const'const=<stuff>對,或通過set_defaults()調用, 直接向ArgumentParser對象告知具有所需行為的函數或對象。使用子解析器時,后者最有用)。 如果這樣做,則可以在從解析返回的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作為值。

您可以考慮為此使用面料。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM