Python 如何从子函数将模块导入main()?
在Python脚本中,我希望控制从子函数向main()导入模块。这可能吗?怎么做 原因:我有一个子函数处理命令行参数(使用argparse),并希望根据用户输入导入模块。具体来说,我想让用户指定matplotlib的后端,这必须在导入matplotlib.pylab之前设置。然而,我认为这个问题有更广泛的用途 以下是一段代码片段:Python 如何从子函数将模块导入main()?,python,import,Python,Import,在Python脚本中,我希望控制从子函数向main()导入模块。这可能吗?怎么做 原因:我有一个子函数处理命令行参数(使用argparse),并希望根据用户输入导入模块。具体来说,我想让用户指定matplotlib的后端,这必须在导入matplotlib.pylab之前设置。然而,我认为这个问题有更广泛的用途 以下是一段代码片段: def main(): args = handleCommandLine(); fig, ax = plt.subplots(1) # ERR
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
实际上是一个全局的。这是一种风格选择;很多人更喜欢把他们的环球杯放在前面。但是如果函数太长,当你读它的时候,你会忘记它是一个全局的,当你得到定义的时候。哦,是的:如果你喜欢的话,继续交换它们。