2014-01-29 3 views
0

Я использую os.system для вызова внешней программы (Apache Batik), которая преобразует svg-данные в образ. Затем я хотел бы загрузить изображение на диск пользователя.Очистить stdout в Python CGI после os.system

Но всякий раз, когда я называю CGI с Apache, я получаю ошибку:

malformed header from script. Bad header=About to transcode 1 SVG file 

То есть стандартный вывод из команды os.system, поэтому после поиска я обнаружил, что я мог бы использовать sys.stdout.flush(), чтобы решить эту проблему но, к сожалению, он по-прежнему дает ту же ошибку. Вот сценарий:

import os 
import cgi 
import sys 
arg = cgi.FieldStorage() 
os.system('java -Djava.awt.headless=true -jar "batik-1.7/batik-rasterizer.jar" "pythonchart.svg"') 
sys.stdout.flush() //NOT WORKING, STILL THE SAME ERROR 

print "Content-Type: image/png" 
print "Content-Disposition: attachment; filename=pythonchart.png" 
print 
print open("pythonchart.png","rb").read() 

ответ

1
from subprocess import Popen, STDOUT, PIPE 
from time import sleep 

x = Popen('external-command -test paramater', shell=True, stdout=PIPE, stdin=PIPE, stderr=STDOUT) 
while x.poll() == None: 
    sleep(0.025) 
x.stdout.close() 
x.stdin.close() 

Рассмотрите возможность использования Popen вместо этого. Одно из преимуществ заключается в том, что вы можете управлять stdout/stdin гораздо более аккуратным способом, который не «истекает» в вашу основную программу. Во-вторых, вы можете потенциально отправить исходные данные в свое внешнее приложение, если это необходимо.

Смежные вопросы