模块中的条件导入

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

【讨论】:

以上是关于模块中的条件导入的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地导入 ES6 模块?

如何有条件地导入ES6模块?

如何导入python中的模块

学习 Python 之 条件循环和包

学习 Python 之 条件循环和包

Typescript - 内部模块中的导入声明不能引用外部模块