Я пытаюсь запустить несколько модульных тестов Python на удаленном сервере сборки с помощью Teamcity. Они терпят неудачу при попытке выполнить некоторый код matplotlib. Я получаю следующий вывод в журналах сборки Teamcity, который, похоже, указывает на бэкэнд matplotlib как на виновника.
XXXXX\stats.py:144: in PerformHypothesisTest
fig, ax = plt.subplots(1, 1, figsize=(10, 6))
.venv\lib\site-packages\matplotlib\pyplot.py:1702: in subplots
fig = figure(**fig_kw)
.venv\lib\site-packages\matplotlib\pyplot.py:1022: in figure
manager = new_figure_manager(
.venv\lib\site-packages\matplotlib\pyplot.py:545: in new_figure_manager
return _get_backend_mod().new_figure_manager(*args, **kwargs)
.venv\lib\site-packages\matplotlib\backend_bases.py:3521: in new_figure_manager
return cls.new_figure_manager_given_figure(num, fig)
.venv\lib\site-packages\matplotlib\backend_bases.py:3526: in new_figure_manager_given_figure
return cls.FigureCanvas.new_manager(figure, num)
.venv\lib\site-packages\matplotlib\backend_bases.py:1811: in new_manager
return cls.manager_class.create_with_canvas(cls, figure, num)
.venv\lib\site-packages\matplotlib\backends\_backend_tk.py:479: in create_with_canvas
with _restore_foreground_window_at_end():
C:\Python310\lib\contextlib.py:135: in __enter__
return next(self.gen)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
@contextmanager
def _restore_foreground_window_at_end():
> foreground = _c_internal_utils.Win32_GetForegroundWindow()
E ValueError: PyCapsule_New called with null pointer
.venv\lib\site-packages\matplotlib\backends\_backend_tk.py:43: ValueError
Тесты проходят нормально оба:
python -m pytestЯ не очень хорошо знаком с тем, как работает Teamcity и как его отлаживать, поэтому буду признателен за любые идеи относительно того, что здесь может быть не так.
На сервере сборки работают следующие версии:
Если это полезно, сервер сборки использует бэкэнд «tkagg» (из matplotlib.get_backend()).
Обновлять:
Спасибо за ответы. Как говорит Снарк, проблема, по-видимому, связана с ошибкой в самой последней версии Matplotlib (3.9.0). Пока это не исправлено, я решал эту проблему, явно устанавливая для бэкэнда Matplotlib значение «Agg», как предложили BadCaffe и Lemmy. Я сделал это программно через файл pytest conftest.py.






У меня аналогичная проблема. Мой скрипт Python перестал работать самопроизвольно (исходный код не менялся). Скрипт отлично работает локально, но не удаленно (сервер). Локальная и удаленная среды Python кажутся одинаковыми. Установка бэкэнда на «Agg» решила проблему для меня. Вот что я сделал:
import matplotlib
matplotlib.use('Agg')
# now do the funny stuff
Надеюсь, это поможет!
У меня была такая же проблема, она как-то связана с отсутствующим физическим видеовыходом (на сервере с ночной сборкой монитор обычно не подключен). Вот почему он работает на вашей личной машине.
matplotlib.use('Agg')
должно работать, но если у вас полностью автоматические ночные сборки, которые сносят какой-то репозиторий и вы не можете изменить код, посмотрите здесь: https://matplotlib.org/stable/users/explain/customizing.html# файл-matplotlibrc
Вы можете поместить файл «matplotlibrc» в папку пользователя (в зависимости от вашей ОС) и просто поместить туда «backend: Agg». Это делает то же самое, что и matplotlib.use('Agg') при изменении используемого бэкэнда, но вы можете сделать это, не меняя код.
Это может быть эта ошибка в matplotlib 3.9.0 с серверной частью tkagg в Windows: github.com/matplotlib/matplotlib/issues/28267. Поэтому попробуйте использовать matplotlib < 3.9.0 до выхода версии 3.9.1.