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