2012-02-28 9 views
2

Pythonスクリプトでは、サブ関数からmain()へのモジュールのインポートを制御したいと思います。これは可能ですか?どうやって?サブ関数からモジュールをmain()にインポートするにはどうしたらいいですか?

なぜ:コマンドライン引数(argparseを使用)を処理し、ユーザー入力に基づいてモジュールをインポートするサブ関数があります。具体的には、matplotlib.pylabをインポートする前にmatplotlibのバックエンドを指定させる必要があります。しかし、私はその質問がより一般的な使用を持っていると思う。あなたは、グローバルを使用していないにもかかわらず、

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

+0

@Daenyth:matplotlibはmatplotlib.pyplotからプロット関数をインポートする前にバックエンドを設定する必要がありますので、コード内で発生する必要があります –

答えて

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

非常にクールです。他の場所で提案されているグローバルなアプローチは、私が望むものに少し近いと思うが。 –

+0

ええ、私はまた 'グローバル'の例を追加しましたが、他の人もそれらを書いていました。 – kindall

+0

素敵な完全な答えをありがとう。あなたの提案の順番を入れ替えるために編集してもよろしいですか?また、関数の先頭ではなく、インポートの直前にグローバルpltを置く理由は何ですか?文体に見えますが、私は自分のスタイルを改善することに興味があります。ありがとう –

0

できません。

plthandleCommandLineから返すか、インポートをmainに移動して解決します。

0

handleCommandLine()の先頭にglobal pltを入れます。

2

import文はずっと割り当てのようなものです - あなたが明示的にglobalとして宣言しない限り、それは、ローカル名に割り当てられます。グローバル名前空間に次のインポートplt

def handleCommandLine(): 
    global plt 
    ... 
    import matplotlib.pyplot as plt 
関連する問題