模块中的条件导入
Posted
技术标签:
【中文标题】模块中的条件导入【英文标题】:Conditional import in a module 【发布时间】:2014-02-13 09:53:02 【问题描述】:我创建了一个模块 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 个不同的名称两次导入像 matplotlib 这样的模块,即。将 matplotlib 导入为 matplotlib1 并将 matplotlib 导入为 matplotlib2,然后根据我的需要使用其中一个或另一个? 【参考方案1】:在您的模块中有一个函数可以确定这一点。
import matplotlib
def setEnv(env):
matplotlib.use(env)
然后在你的程序中你可以有modA.setEnv('ps')
或者其他基于if-else语句条件的东西。
您不需要在此处进行条件导入(因为您只使用一个外部模块),但可以这样做:
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)?
【讨论】:
这是一个很好的建议,但是有一个问题:一旦我导入 matplotlib,然后通过该函数调用 matplotlib.use(),我仍然想导入 matplotlib.pyplot(导入 matplotlib 和 matplotlib .use() 确实是某种初始化。有没有办法解决这个问题? 究竟是什么阻止了您独立导入 matplotlib.pyplot? 因为单独导入 matplotlib.pyplot 将使用默认后端,并且(我在这里可能错了)似乎以编程方式设置该后端的唯一方法是首先导入 matplotlib 并调用matplotlib.use('desired_backend') 啊,好吧,在你的use()
之后导入它。
@user3208430 只需将其指定为global
,它将始终可用。在此处查看更多信息:***.com/questions/11990556/…【参考方案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'
在模组A中:
import os
import matplotlib
matplotlib.use(os.environ['MATPLOTLIB_USE'])
【讨论】:
以上是关于模块中的条件导入的主要内容,如果未能解决你的问题,请参考以下文章