由于 PySide2 和 Matplotlib,Travis-CI 无法构建

Posted

技术标签:

【中文标题】由于 PySide2 和 Matplotlib,Travis-CI 无法构建【英文标题】:Travis-CI failing to build due to PySide2 and Matplotlib 【发布时间】:2019-06-30 17:16:10 【问题描述】:

我有一个 github 存储库,我在其中开发了一个 electrical calculation software。

最近我完全从 PyQt5 迁移到 PySide2。

今天我添加了用于持续集成的 Travis-CI 作为 Githb 存储库的挂钩。这意味着当我推送一些更改时,travis-CI 会在他们云中的独立机器上启动我的存储库的构建。

Travis CI 因以下原因失败:

ImportError while importing test module '/home/travis/build/SanPen/GridCal/src/tests/test_branch_tolerance.py'. Hint: make sure your test modules/packages have valid Python names. Traceback: src/tests/test_branch_tolerance.py:1: in <module>
    from GridCal.Engine import * src/GridCal/Engine/__init__.py:17: in <module>
    from GridCal.Engine.basic_structures import * src/GridCal/Engine/basic_structures.py:23: in <module>
    from GridCal.Engine.plot_config import LINEWIDTH, plt src/GridCal/Engine/plot_config.py:18: in <module>
    matplotlib.use('Qt5Agg') ../../../virtualenv/python3.6.7/lib/python3.6/site-packages/matplotlib/cbook/deprecation.py:307: in wrapper
    return func(*args, **kwargs) ../../../virtualenv/python3.6.7/lib/python3.6/site-packages/matplotlib/__init__.py:1297: in use
    switch_backend(name) ../../../virtualenv/python3.6.7/lib/python3.6/site-packages/matplotlib/pyplot.py:230: in switch_backend
    newbackend, required_framework, current_framework)) 

E   ImportError: Cannot load backend 'Qt5Agg' which requires the 'qt5' interactive framework, as 'headless' is currently running

失败的文件plot_config.py开头有如下matplotlib配置:

import PySide2  # this line is necessary so that Matplotlib recognises that PySide is the Qt Backend
import matplotlib
matplotlib.use('Qt5Agg')
# matplotlib.rcParams['backend.qt5'] = 'PySide2'  # this is not supported anymore
from matplotlib import pyplot as plt

这段代码是我在几个线程中发现的正确做法。但是,独立机器上的自动化测试会因此而失败。

那么,告诉 matplotlib 使用 PySide2 的最佳且明确的方法是什么?

所需的包是(requirements.txt):

PySide2>=5.11 
numpy>=1.14.0 
scipy>=1.0.0 
networkx>=2.1 
pandas>=0.22 
xlwt>=1.3.0 
xlrd>=1.1.0 
matplotlib>=3.1.0 
qtconsole>=4.3.1 
pyDOE>=0.3.8 
pySOT>=0.2.1 
openpyxl>=2.4.9 
pulp>=1.6.8 
smopy>=0.0.6 
chardet>=3.0.4 
scikit-learn>=0.18 
geopy>=1.16 
pytest>=3.8 
h5py>=2.9.0

【问题讨论】:

你用 pyplot 做什么?该项目看起来像是完全将 matplotlib 嵌入到 PySide GUI 中? plt 在文件中用于设置默认样式。专注于后端。 是的,所以错误只是因为您导入了 pyplot,这似乎没有必要。您也不需要 pyplot 来设置任何默认样式。所以这里真的有两件事,一个是让你的 repo 运行,另一个是在使用 pyplot 时如何设置后端使用 pyside2。 文件是这个github.com/SanPen/GridCal/blob/master/src/GridCal/Engine/… 我说,删除matplotlib.use这一行。我的意思是,你不想在.use 的意义上设置任何后端。这只是 pyplot 需要的,但使用 pyplot 与将 matplotlib 嵌入自定义 GUI 是矛盾的。这样不仅可以防止这些测试失败,还可以防止在启动软件之前的任何时候可能已经设置不同后端的用户出现问题。 【参考方案1】:

您必须按照docs 中的说明启用 XVFB 服务才能测试需要图形环境的库:

dist: xenial   # required for Python >= 3.7
services:
  - xvfb
language: python
python:
  - "3.6"
  - "3.7"
# command to install dependencies
install:
  - pip install -r requirements.txt
# command to run tests
script:
  - pytest

我已经为您的存储库创建了一个PR。

【讨论】:

以上是关于由于 PySide2 和 Matplotlib,Travis-CI 无法构建的主要内容,如果未能解决你的问题,请参考以下文章

PySide2 和 Matplotlib:如何让 MatPlotLib 在单独的进程中运行? ..因为它不能在单独的线程中运行

在 Pyside2 中嵌入 Matplotlib 的释放错误

如何使用 PySide2 在 matplotlib 中显示图形?

在使用 matplotlib 和 PySide2 运行的应用程序中使用 pdb 调试器时出现“事件循环已在运行”

在同一进程中将 matplotlib 与 Qt5 后端一起使用并运行现有 QApplication

Matplotlib 事件处理:他们何时发送 matplotlib 事件以及何时发送 Qt 事件