在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
答案 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()
的开头。