2012-06-11 2 views
3

서브 프로세스로 실행되는 스크립트 (apache 서버에서 파이썬 cgi 스크립트에 의해 실행 됨)에서 실행되는 스크립트에서 matplotlib로 플롯 (즉 파일 작성)하고 싶지만 어떻게 든 플롯이 내가 사용하는 백엔드에 따라 서버가 생성되거나 서버가 충돌합니다. 나는 "agg"를 사용해야한다고 생각하고, 그 경우 플롯이 생성되지만 서버가 충돌합니다 (내부 서버 오류). 여기에 로그는 다음과 같습니다Matplotlib 서브 프로세스/백엔드 문제

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 스크립트는 순간에 서브 프로세스의 출력에 의존 넣은 사람은 아니다, 그래서 정말 경고 나쁜 헤더를하지 않습니다 (그리고 그런 문제가있을 때하지 않습니다 하위 프로세스 시작).

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 : 나는 우분투를 11.04 및 아파치

답변

1

내가 stdout와 아파치에 플롯 스크립트 출력 물건이 헤더로는 CGI에서 기대되는 해석이 의심을 사용하고 있습니다. 당신이 subprocess와 스크립트를 호출 할 때

은, 대단히 감사합니다, 그것은 작동이

from subprocess import Popen, STDOUT 
import os 

p = Popen(["ls","-l"], stdout=open(os.devnull, "w"), stderr=STDOUT) 
+1

처럼, 널 (null)을 dev에 출력을 리디렉션! – user1448268

+0

대단하다 - 봉사하게되어 기쁩니다! –