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

Python 如何从子函数将模块导入main()?,python,import,Python,Import,在Python脚本中,我希望控制从子函数向main()导入模块。这可能吗?怎么做 原因:我有一个子函数处理命令行参数(使用argparse),并希望根据用户输入导入模块。具体来说,我想让用户指定matplotlib的后端,这必须在导入matplotlib.pylab之前设置。然而,我认为这个问题有更广泛的用途 以下是一段代码片段: def main(): args = handleCommandLine(); fig, ax = plt.subplots(1) # ERR

在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

如果您想让它表现为您在模块顶部执行了
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
你不能


我可以通过从
handleCommandLine
返回
plt
或者将导入移动到
main

handleCommandLine()
的开头放置
global plt
来解决这个问题,
import
语句很像一个赋值——它赋值给一个本地名称,除非您明确声明为
global
。以下内容将
plt
导入全局命名空间:

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

为什么不能将其导入整个文件?@Daenyth:Matplotlib要求在从Matplotlib.pyplot导入绘图函数之前设置后端,因此必须在代码中进行,非常酷。虽然我认为其他地方建议的全局方法有点接近我想要的。是的,我还添加了一个
global
示例,而其他人也在编写这些示例。感谢您提供的完整答案。你能同意我修改一下你的建议的顺序吗?还有,您有什么理由将全局plt放在导入之前而不是函数的顶部?看起来很有风格,但我对改进我的风格很感兴趣。感谢
global
可以去任何地方;我在
import
旁做了正确的说明,以便更清楚地说明,您即将定义的
plt
实际上是一个全局的。这是一种风格选择;很多人更喜欢把他们的环球杯放在前面。但是如果函数太长,当你读它的时候,你会忘记它是一个全局的,当你得到定义的时候。哦,是的:如果你喜欢的话,继续交换它们。