我创建了一个模块modA,我在主程序中导入。根据我的主程序中发生的事情(它具有交互模式和批处理脚本模式),我希望modA本身可以使用TkAgg后端或ps后端导入matplotlib。我的主程序有没有办法将信息传递给modA告诉它应该如何导入matplotlib?
澄清情况:
主程序:
#if we are in interactive mode
#import modA which imports matplotlib using TkAgg backend
#else
#import modA which imports matplotlib using the ps backend
模块modA:
#import matplotlib
#matplotlib.use('ps') or matplotlib.use('TkAgg') (how can I do this?)
答案 0 :(得分:7)
在您的模块中有一个功能来决定这一点。
import matplotlib
def setEnv(env):
matplotlib.use(env)
然后在您的程序中,您可以根据if-else语句条件获得modA.setEnv('ps')
或其他内容。
这里不需要条件导入(因为您只使用一个外部模块),但可以这样做:
if condition:
import matplotlib as mlib
else:
import modifiedmatplotlib as mlib
有关在函数中导入模块的更多信息,请参阅:
Python: how to make global imports from a function
Is it possible to import to the global scope from inside a function (Python)?
答案 1 :(得分:2)
您可以通过评估传递给命令行的参数来检测会话的启动方式:
import sys
import matplotlib
if '-i' in sys.argv:
# program started with an interactive session
matplotlib.use('TkAdd')
else:
# batch session
matplotlib.use('ps')
如果没有,您可以使用os.environ在模块之间进行通信:
主要:
import os
if interactive:
os.environ['MATPLOTLIB_USE'] = 'TkAdd'
else:
os.environ['MATPLOTLIB_USE'] = 'ps'
在modA中:
import os
import matplotlib
matplotlib.use(os.environ['MATPLOTLIB_USE'])