2012-02-28 31 views
2

在Python腳本中,我想控制從子函數將模塊導入main()。這可能嗎?怎麼樣?如何從子函數將模塊導入main()?

爲什麼:我有一個處理命令行參數的子函數(使用argparse)並希望根據用戶輸入導入模塊。具體來說,我想讓用戶指定matplotlib的後端,它必須在導入matplotlib.pylab之前設置。但是,我認爲這個問題有更廣泛的用途。

下面的代碼片段:

def main(): 

    args = handleCommandLine(); 

    fig, ax = plt.subplots(1) # ERROR: plt not defined 

    # Snip ... 


def handleCommandLine(): 
    p = argparse.ArgumentParser() 
    p.add_argument('--backend', '-b', default=None, help='Specify plotting backend') 
    args = p.parse_args() 

    if args.backend != None: 
     matplotlib.use(args.backend) #Must occur before importing pyplot 

    import matplotlib.pyplot as plt #Must occur after setting backend, if desired 
    return args 
+0

爲什麼你不能將它導入到整個文件? – Daenyth 2012-02-28 22:22:31

+0

@Daenyth:Matplotlib需要在從matplotlib.pyplot導入繪圖函數之前設置後端,因此它必須在代碼 – 2012-02-29 06:53:26

回答

4

如果您想好像你在模塊的頂部執行import matplotlib.pyplot as plt它的行爲,即使你沒有,使用全局:

def handleCommandLine(): 
    p = argparse.ArgumentParser() 
    p.add_argument('--backend', '-b', default=None, help='Specify plotting backend') 
    args = p.parse_args() 

    if args.backend != None: 
     matplotlib.use(args.backend) #Must occur before importing pyplot 

    global plt #Style choice: Can also be placed at the top of the function 
    import matplotlib.pyplot as plt #Must occur after setting backend 
    return args 

否則,您可以通過一個函數返回的包括圖書館參考,以同樣的方式您處理任何其他變量:

def main(): 
    plt, args = handleCommandLine() # CHANGED HERE 
    fig, ax = plt.subplots(1) 
    # ...  

def handleCommandLine(): 
    p = argparse.ArgumentParser() 
    p.add_argument('--backend', '-b', default=None, help='Specify plotting backend') 
    args = p.parse_args() 

    if args.backend != None: 
     matplotlib.use(args.backend) #Must occur before importing pyplot 

    import matplotlib.pyplot as plt #Must occur after setting backend, if desired 
    return plt, args # CHANGED HERE 
+0

中出現非常酷。雖然我認爲其他地方提出的全球方法與我想要的有點接近。 – 2012-02-28 22:29:03

+0

是的,我還添加了一個「全局」示例,而其他人也在寫這些示例。 – kindall 2012-02-28 22:30:16

+0

感謝您的不錯的完整答案。你可以用我編輯來交換你的建議順序嗎?還有,你把全局plt放在導入之前而不是放在函數頂部的原因是什麼?似乎風格,但我有興趣改善我的風格。謝謝 – 2012-02-28 22:39:33

0

你不能。

我會通過返回plthandleCommandLine或將輸入移動到main來解決此問題。

0

global plt放在handleCommandLine()的開頭。

2

import陳述非常類似於賦值 - 它將賦值給本地名稱,除非您明確聲明爲global。以下進口到全球命名空間plt

def handleCommandLine(): 
    global plt 
    ... 
    import matplotlib.pyplot as plt