如何从子函数将模块导入main()?

时间:2012-02-28 22:19:30

标签: python import

在Python脚本中,我想控制从子函数将模块导入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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

import语句非常类似于赋值 - 它分配给本地名称,除非您明确声明为global。以下将plt导入全局命名空间:

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

答案 2 :(得分:0)

你不能。

我可以通过从plt返回handleCommandLine或将导入移至main来解决此问题。

答案 3 :(得分:0)

global plt放在handleCommandLine()的开头。