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

sil*_*ado 15 python linux matplotlib

我正在脚本中生成matplotlib数字,我可以在有或没有图形显示的情况下交替运行.我希望脚本能够自动调整:通过显示,它应该以交互方式显示数字,而没有显示,它应该只是将它们保存到文件中.

没有正在运行的X服务器生成matplotlib图的问题的答案,我了解到可以使用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")
Run Code Online (Sandbox Code Playgroud)

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

我也试过使用实验函数matplotlib.switch_backend而不是matplotlib.use,但这会产生RuntimeError.

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

Oz1*_*123 16

如果你在python中有一个带有OS模块的显示器,你可以直接检测.就我而言

>>> import os
>>> os.environ["DISPLAY"]
':0.0'
Run Code Online (Sandbox Code Playgroud)

  • 这在 Windows 命令行中不起作用。当你从 cmd 运行 python 时,`plt.show()` 会打开一个带有绘图的窗口。但是,在`os.environ` dict 中没有定义`DISPLAY` 键。因此,在这种情况下,脚本会写入文件而不是打开交互式窗口。 (2认同)

eit*_*ich 6

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

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

请参阅/sf/answers/92791121/

请注意,该行matplotlib.use('Agg')必须出现在第一次导入之后matplotlib(否则会出错)。


rec*_*hen 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()
Run Code Online (Sandbox Code Playgroud)