2013-07-17 61 views
4

我运行在Amazon EC2上的Ubuntu 12.04的xvfb的服务器上执行以下PyQt的应用程序,我得到正确的输出中从Qt应用程序,但是当应用程序完成后我总是得到上述错误。为什么我得到这个错误?我认为这可能是因为xvfb服务器没有正确终止,但我不确定。的Xvfb IO错误:客户端打死

import sys 
from PyQt4.QtGui import * 
from PyQt4.QtCore import * 
from PyQt4.QtWebKit import * 
from xvfbwrapper import Xvfb 


args = {"nolisten":"tcp"} 
vdisplay = Xvfb(**args) 
vdisplay.start() 
app = QApplication(sys.argv) 
def update(): 
    print "upd" 
t = QTimer() 
t.start(500) 
t.timeout.connect(update) 
stopTimer = QTimer(timeout=app.quit,singleShot=True) 
stopTimer.start(4000) 
app.exec_() 
print "done with app" 
vdisplay.stop() 

回答

3

对我来说@乌陵的解决方案不工作,因为如果你不使用vdisplay.stop(),此XVFB过程是当脚本退出,这是一个问题杀害。我的解决方案是与后台调用明确杀死进程,片刻后:

# Workaround for a problem preventing vdisplay.stop() to work 
# normally, because apparently Qt is still keeping its handle on X 
# at this point. 
import os 
os.system('(sleep 5 && kill -9 %d) &' % vdisplay.proc.pid) 
+0

睡了一个短终止后的时间也解析了直接使用xvfb-run运行时类似的错误消息(尽管我复制并修改了xvfb-run来这样做) – Gnat

0

另一种丑陋的方式来解决,这是在其他子包的一切:

import xvfbwrapper 
import sys 
import subprocess as sub 

with xvfbwrapper.Xvfb(): 
    p = sub.Popen(
     ["python", "yourscript.py"] + sys.argv[1:], 
     stdout=sub.PIPE, stderr=sub.PIPE 
    ) 
    stdout, stderr = p.communicate() 
    print stdout 
    print >> sys.stderr, stderr 
    sys.exit(p.returncode)