Ошибка Xvfb IO: клиент убит

Я запускаю следующее приложение pyqt на сервере xvfb на amazon ec2 ubuntu 12.04, я получаю правильный вывод из приложения 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() 

Для меня решение @ 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) 

Еще один уродливый способ обойти это – обернуть все в другой подпроцесс:

 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)