模块中的条件导入

时间:2014-01-23 02:27:43

标签: python matplotlib

我创建了一个模块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?)

2 个答案:

答案 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'])