在os.system之后清除Python CGI中的stdout

时间:2014-01-29 10:43:27

标签: python apache svg cgi

我正在使用os.system来调用将svg数据转换为图像的外部程序(Apache Batik)。然后我想在用户的磁盘中下载图像。

但每当我用Apache调用cgi时,我都会收到错误:

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

这是来自os.system命令的stdout,所以在搜索之后我发现我可以使用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 个答案:

答案 0 :(得分: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,它不会“渗透”到你的主程序中。其次,如果需要,您可以将输入发送到外部应用程序。