Xvfb IO错误:客户端被杀死

时间:2013-07-17 23:58:32

标签: python qt pyqt headless xvfb

我在amazon ec2 ubuntu 12.04上的xvfb服务器上运行以下pyqt应用程序,我从qt应用程序获得了正确的输出,但是当应用程序完成时我总是得到上述错误。为什么我收到此错误?我想这可能是因为xvfb服务器没有正确终止,但我不确定。

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 个答案:

答案 0 :(得分:3)

对我来说@ urim的解决方案不起作用,因为如果你不使用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)

答案 1 :(得分:1)

解决这个问题的另一个丑陋方法是将所有内容包装在另一个子进程中:

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)

答案 2 :(得分:0)

只要nodesource-release-el6-1.noarch nodejs-9.11.1-1nodesource.x86_64 实例处于活动状态,就会收到错误。一种解决方案是将QApplication调用推向程序的出口,例如使用Xvfb.stop()模块:

atexit
相关问题