使用matplotlib自动检测显示可用性

时间:2011-11-24 12:52:31

标签: python linux matplotlib

我正在脚本中生成matplotlib数字,我可以选择使用或不使用图形显示。我希望脚本能够自动调整:通过显示,它应该以交互方式显示数字,而没有显示,它应该只是将它们保存到文件中。

从问题Generating matplotlib graphs without a running X server的答案中,我了解到可以使用Agg后端进行非交互式绘图。

所以我正在尝试使用此代码:

import matplotlib
try:
    import matplotlib.pyplot as plt
    fig = plt.figure()
    havedisplay = True
except:
    matplotlib.use("Agg")
    import matplotlib.pyplot as plt
    fig = plt.figure()
    havedisplay = False
# do the plotting
if havedisplay:
    plt.show()
else:
    fig.savefig("myfig.png")

在具有显示器的情况下,这是例外的。但是,如果没有显示,则对matplotlib.use的调用无效,因为已经选择了显示。很明显,我应该在matplotlib.use之前调用import matplotlib.pyplot,但之后我不知道如何测试显示是否可用。

我还尝试使用实验函数matplotlib.switch_backend而不是matplotlib.use,但这会生成RuntimeError。

有人知道如何使上述代码按预期工作,或者可以建议另一种方法来检测显示器是否可用于matplotlib?

7 个答案:

答案 0 :(得分:15)

如果你在python中有一个带有OS模块的显示器,你可以直接检测。 在我的情况下它是

>>> import os
>>> os.environ["DISPLAY"]
':0.0'

答案 1 :(得分:5)

试试这个吗?

import matplotlib,os
r = os.system('python -c "import matplotlib.pyplot as plt;plt.figure()"')
if r != 0:
    matplotlib.use('Agg')
    import matplotlib.pyplot as plt
    fig = plt.figure()
    fig.savefig('myfig.png')
else:
    import matplotlib.pyplot as plt
    fig = plt.figure()
    plt.show()

答案 2 :(得分:4)

以下代码适用于Linux和Windows(假设有显示设备):

import os
import matplotlib
if os.name == 'posix' and "DISPLAY" not in os.environ:
    matplotlib.use('Agg')

请参阅https://stackoverflow.com/a/1325587/896111

请注意,第一次导入matplotlib.use('Agg')后必须显示第matplotlib行(否则您将收到错误消息)。

答案 3 :(得分:3)

通过结合上述两种方法,您可能会获得最佳解决方案:

havedisplay = "DISPLAY" in os.environ
if not havedisplay:
    exitval = os.system('python -c "import matplotlib.pyplot as plt; plt.figure()"')
    havedisplay = (exitval == 0)

此组合的原因是os.system命令的运行时间可能需要一段时间。因此,当您确定显示时(通过os.environ值判断),您可以节省时间。 另一方面,即使DISPLAY变量中未设置os.environ键,绘图方法仍有可能与图形界面一起使用(例如,使用Windows命令行时)。

答案 4 :(得分:1)

当使用GUI后端图形对象有show()方法时,可以用它来进行切换:

import matplotlib
#matplotlib.use("Agg")

import matplotlib.pyplot as plt
fig = plt.figure()
havedisplay = False
if hasattr(fig, "show"):
    plt.show()
else:
    print "save fig"
    fig.savefig("myfig.png")

答案 5 :(得分:1)

@ Oz123提供的解决方案为我生成了语法错误。但是,我能够使用以下方法轻松检测显示:

import os
havedisplay = "DISPLAY" in os.environ
#plotting...

无论如何,这是我能找到的最简单的事情。

答案 6 :(得分:0)

import os
have_display = bool(os.environ.get('DISPLAY', None))
如果have_display不在环境中或为空字符串,则

DISPLAY为False。否则,是真的