2014-01-29 68 views
0

我使用os.system調用將svg數據轉換爲圖像的外部程序(Apache Batik)。然後我想下載用戶磁盤中的圖像。在os.system中清除Python CGI中的stdout

但每當我打電話與Apache的CGI,我得到的錯誤:

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代替。 一個明顯的好處是,你可以控制標準輸出/標準輸入一個更好的方式,不會「流血」到你的主程序。其次,如果需要,您可以將輸入發送到您的外部應用程序。