在 Travis 中测试基于 matplotlib 的绘图 CI

Testing matplotlib-based plots in Travis CI

我有一个包,其中有一个模块可以帮助用户使用 matplotlib 生成特定的绘图。当我在 Travis 的单元测试中调用这些函数时,出现以下错误:

RuntimeError: Invalid DISPLAY variable

我该如何解决?

生成绘图后,我的函数通常会调用 pyplot.show(),这会打开一个需要关闭的 window。当我在 Travis 的单元测试中调用这些函数时,它们会永远挂断。

如何测试这些绘图是使用 Travis CI 生成的?

更新: 根据@matt-pitkin 评论,该方法已更新。如果使用 Ubuntu Xenial 容器,启用 xvfb 的首选方法是通过 Travis 服务:

services:
- xvfb

但是,如果使用 Ubuntu Trusty 容器,我的原始答案(如下)仍然相关。我还建议阅读@david-ketcheson 的回答,它对原始问题有更具体的解决方案。


为了在 Travis 中设置 DISPLAY 变量,您需要从他们的 VM 中模拟显示。 They teach how to do it 使用 xvfb 通过将以下内容添加到 .travis.yml 文件的 before_script 中:

before_script: # configure a headless display to test plot generation
- "export DISPLAY=:99.0"
- "sh -e /etc/init.d/xvfb start"
- sleep 3 # give xvfb some time to start

为了让 Travis 不被情节挂断,干脆不要打电话给 pyplot.show()。如果您要测试太多图,请务必调用 pyplot.close() 否则它会抱怨打开的图像太多。

您可以通过使用 matplotlib 中的 "agg" 后端来解决此问题而无需显式设置显示。无论如何,根据我的经验,这是必要的,以确保生成图像的一致性。只要确保你

 matplotlib.use('agg')

在导入 pyplot 或 pylab 之前。我已经解释了更多 here