3

我想从作为子进程运行的脚本(由来自 apache 服务器的 python cgi-script 启动)的脚本中使用 matplotlib 绘制(即编写文件),但不知何故,要么没有创建情节,要么服务器崩溃,具体取决于我使用的后端。我认为我应该使用“agg”,并且在这种情况下创建了情节,但是服务器随后崩溃(内部服务器错误)。这是日志:

AH01215: /usr/lib/pymodules/python2.7/gtk-2.0/gtk/__init__.py:57: GtkWarning: could not open display, referer: http://localhost/
AH01215:   warnings.warn(str(e), _gtk.Warning), referer: http://localhost/
AH01215: /usr/local/lib/python2.7/dist-packages/matplotlib/backends/backend_gtk.py:49: GtkWarning: IA__gdk_cursor_new_for_display: assertion `GDK_IS_DISPLAY (display)' failed, referer: http://localhost/
AH01215:   cursors.MOVE          : gdk.Cursor(gdk.FLEUR),, referer: http://localhost/
malformed header from script 'submit.cgi': Bad header: ['/home/user/..., referer: http://localhost/

cgi-script 目前不依赖于子进程的输出,所以我并没有真正得到 bad-header 警告(不启动子进程时没有这样的问题)。情节脚本的开头如下所示:

import string
import sys
import os
from math import *
import tempfile
os.environ['MPLCONFIGDIR'] = tempfile.mkdtemp()
import matplotlib
matplotlib.use('Agg') 
import matplotlib.pyplot as matplot
from matplotlib import mpl

到目前为止,我只使用 matplotlib 进行了相当简单的绘图,而不是作为子进程,所以我非常感谢你的帮助。

PS:我使用的是 ubuntu 11.04 和 apache2

4

1 回答 1

1

我怀疑您的绘图脚本输出内容到stdoutapache 将其解释为它期望从 cgi 获得的标头。

当您使用subprocess调用脚本时,将输出重定向到 dev null,如下所示

from subprocess import Popen, STDOUT
import os

p = Popen(["ls","-l"], stdout=open(os.devnull, "w"), stderr=STDOUT)
于 2012-06-11T07:05:50.467 回答