2010-06-05 5 views
0

Matplotlib et Pylab ne fonctionnent pas en Python CGI. Mais la même combinaison fonctionne dans le shell Python. Voici le code:Matplotlib et Pylab ne fonctionnent pas en Python CGI

#!C:/Python26/python 
import cgi 
import cgitb 
import sys 
import os 
cgitb.enable() 

# set HOME environment variable to a directory the httpd server can write to 
os.environ[ 'HOME' ] = '/tmp/' 

import matplotlib 
# chose a non-GUI backend 
matplotlib.use('Agg') 

import pylab 

#Deals with inputing data into python from the html form 
form = cgi.FieldStorage() 

# construct your plot 
pylab.plot([1,2,3]) 

print "Content-Type: image/png\n" 

# save the plot as a png and output directly to webserver 
pylab.savefig("test.png") 
+0

Un code? Ou devrions-nous deviner ce que vous faites mal? –

Répondre

0

Votre code est un peu incomplet. En l'état, vous écrivez l'intrigue dans un fichier sur le disque dur du serveur. Vous ne le renvoyez pas au navigateur. Une méthode pour cela consiste à enregistrer le tracé dans un objet StringIO, puis à le diffuser.

import cStringIO 
imgData = cStringIO.StringIO() 
pylab.savefig(imgData, format='png') 

# rewind the data 
imgData.seek(0) 

print "Content-Type: image/png\n" 
print 

print imgData.read() 
1

Mettre

import cgitb ; cgitb.enable() 

en haut de votre script, exécutez et nous montrent le retraçage. Sans cela, la seule aide que nous pouvons vous apporter est de prier pour vous.

Le retraçage devrait être assez clair sans aide supplémentaire vraiment. A part ça, Python cgi est extrêmement lent et pas vraiment quelque chose que vous pouvez utiliser pour quelque chose de non trivial.

0

Il semble que ce soit un bug dans le module Python ctypes. On doit commenter la ligne

#CFUNCTYPE(c_int)(lambda: None). 

dans $HOME/lib/python2.7/ctypes/__init__.py. Personne ne comprend ce que cela signifie, c'est une solution de contournement pour Windows qui pose des problèmes dans Linus CGI, voir Python ctypes MemoryError in fcgi process from PIL library.