2013-09-30 127 views
1

我搜索並嘗試下面的東西,但無法找到任何解決辦法使用argparse從我的模塊通過它的命令行參數的另一個模塊,請讓我知道這是可能的:呼叫與蟒蛇

我試圖發展一個python模塊作爲包裝器,我使用它的.main()調用另一個第三方模塊,並提供我需要從模塊中的命令行獲取的必需參數。我的模塊也需要一些參數。

我正在使用argparse來解析調用模塊和我的模塊的命令行。調用參數列表是巨大的(超過40),這是可選的,但可能需要隨時使用我的模塊。目前我已經在我的模塊中聲明瞭一些重要的參數來解析,但我需要用所有參數進行擴展。

我想在我的模塊中提供所有參數,而無需在add_argument中聲明。我試着用parse_known_args這也需要聲明所有參數是必需的。

有沒有什麼辦法可以將所有參數傳遞給調用模塊而無需在模塊中聲明?如果可能,請讓我知道如何做到這一點。

由於提前,

回答

0

只要您調用第三方的模塊,一個可能的解決方案是 變化sys.argv中並在運行時sys.argc以反映 了正確的參數一旦你完成了你自己的參數,你要調用的模塊。

+0

記得做此之前進口包裹模塊。 –

+0

我也試過,在我的情況下,第三方模塊的參數也從我的模塊命令行中獲取。意味着如果第三方模塊接受'a','b','c'參數,我將從我的模塊的命令行中獲取這些值以及我所需的參數。 – Chetan

2

這種情況適合嗎?

模塊B:

import argparse 
parser = argparse.... 
def main(args): 
    .... 
if __name__ == '__main__': 
    args = parser.parse_args() 
    main(args) 

模塊A

import argparse 
import B 
parser = argparse.... 
# define arguments that A needs to use 

if _name__=='__main__': 
    args,rest = parser.parse_known_args() 
    # use args 
    # rest - argument strings that A could not process 
    argsB = B.parse_args(rest) 
    # 'rest' does not have the strings that A used; 
    # but could also use 
    # argsB = B.parse_known_args() # using sys.argv; ignore what it does not recognize 
    # or even 
    # argsB = B.parse_known_args(rest) 
    B.main(argsB) 

替代甲

import argparse 
import B 
parser = argparse.ArgumentParser(parents=[B.parser], add_help=False) 
# B.parser probably already defines -h 
# add arguments that A needs to use 

if _name__=='__main__': 
    args = parser.parse_args() 
    # use args that A needs 
    B.main(args) 

在一種情況下,每個解析器只處理它識別字符串。在另一個A.parser中處理所有事情,使用'父母'參數來'學習'B.parser認識的東西。

+0

hpaulj,我不想將A的論點再次定義爲它的巨大列表,我希望它能夠在A(第三方模塊)中作爲它的定義工作。 – Chetan

3

感謝hpaulj,mguijarr和Mike,

我能夠與所有上述投入來解決問題,比如以下:

我的模塊:

import sys 
import argparse 
parser = argparse.ArgumentParser(description='something') 
parser.add_argument('--my_env', help='my environment') 

if __name__=='__main__': 
    args,rest = parser.parse_known_args() 
    rest_arg = ['calling_module.py'] 
    rest_arg.extend(rest) 
    sys.argv = rest_arg 
    import calling_module 
    calling_module.main() 
+0

太棒了!然後,您可以提高我們的答案;) – mguijarr