Подтвердить что ты не робот

Python Headless MatplotLib/Pyplot

Я пытаюсь сделать мой анализ данных и отчетов меньше глазных колосков и более графических с автоматически созданных графических файлов, и для этого я играл с matplotlib/pyplot/pylab. Работает блестяще, но когда я пытаюсь запустить его на безголовом сервере...

tkinter.TclError: no display name and no $DISPLAY environment variable

Для этого приложения я использую только PyLab, но после небольшого google я добавил ниже, прежде чем импортировать pylab:

import matplotlib
matplotlib.use("Agg")

Что должно было изменить бэкэнд, но не повлиять.

Любые идеи, что я делаю неправильно?

У удаленной машины есть возможности переадресации X, но поскольку это приложение не должно НЕОБХОДИМО отображать что-либо, я считаю, что обычный ssh ​​-X-хак переполнен.

Примеры: обман Fiendish

Пример рабочего кода на одном компьютере

import matplotlib
matplotlib.use("Agg")
import numpy as np
import pylab as pl


xvals=np.arange(100)
yvals=np.cumsum(np.random.random(100))
yvals[-10:]=0
yvals=np.log(yvals)
pl.close()

pl.plot(xvals,yvals)
pl.xlabel("X")
pl.ylabel("Y")
pl.title("Title")

pl.savefig("testgraph.png")

Нерабочий реальный код

import matplotlib
matplotlib.use("Agg")
import numpy as np
import pylab as pl
import utility as util
import os

... non graph stuff...
def graph_p(self):
    pl.close()
    channels=range(self.p.shape[0])
    for line in range(self.p.shape[1]):
        yvals=np.ma.masked_invalid(map(util.watts_to_dbmhz,self.p[:,line]))
        pl.plot(channels,yvals) #Error says it occurs here
    pl.xlabel("Subchannel Index")
    pl.ylabel("Power (dbmhz)")
    pl.title("Plot of per-tone power assignments for %d lines"%self.p.shape[1])
    pl.savefig(self.dest+self.scenario+'-power.png')

Ничто другое не касается пипота.

4b9b3361

Ответ 1

Оказывается, файл утилиты (не мой!) pylab в pylab для чего-то еще. matplotlib выделение matplotlib данных matplotlib на начальную страницу.

Ответ 2

Все, что вы описываете, звучит правильно. Что произойдет, когда вы запустите это:

import matplotlib
matplotlib.use('Agg')
import pylab
pylab.plot([1,2], [3,4], linestyle='-')
pylab.savefig('foo.png')

В моей среде он производит это (я уменьшил его):

enter image description here

Ответ 3

Попробуйте импортировать matplotlib и установить сервер Agg перед импортом numpy:

import matplotlib
matplotlib.use("Agg")