On 07/11/2007, at 2:08 AM, Vladimir Pouzanov wrote:

Is there any way to read stdin line by line without blocking? My application receives data over stdin (one command per line) and should react immediately.

I've tried to make such thing:
    self.stdin = QtCore.QFile(self)
    self.stdin.open(0, QtCore.QIODevice.ReadOnly)
self.connect(self.stdin, Qt.SIGNAL('readyRead()'), self.on_stdinReadyRead)
buy readyRead never fires.

Then I've added
self.qsn = QtCore.QSocketNotifier(0, QtCore.QSocketNotifier.Read, self)
    self.connect(self.qsn, Qt.SIGNAL('activated(int)'), self.on_qsn)
and made on_qsn() call on_stdinReadyRead. It works but there's another problem: self.stdin.canReadLine() never returns true, and readAll() blocks forever.


I get the same problem in the following doctest.
Also I don't see the bytesWritten signal either.


Test QFile Signals:

    >>> import os
    >>> from PyQt4.Qt import QApplication, QObject, SIGNAL
    >>> from PyQt4.QtCore import QFile, QIODevice

Setup a receiver for the 'readReady()' signal:

    >>> def handler(*args):
    ...     print 'handler', args

Create a pair of QFile objects to read/write from/to a pipe:

    >>> fdin, fdout = os.pipe()

    >>> qin = QFile()
    >>> QObject.connect(qin, SIGNAL('readyRead()'), handler)
    True
    >>> qin.open(fdin, QIODevice.ReadOnly)
    True

    >>> qout = QFile()
    >>> QObject.connect(qout, SIGNAL('bytesWritten(qint64)'), handler)
    True
    >>> QObject.connect(qout, SIGNAL('aboutToClose()'), handler)
    True
    >>> qout.open(fdout, QIODevice.WriteOnly)
    True

Send some data to the QFile object's input:

    >>> qout.write('hello')
    5L
    >>> qout.flush()
    True

Expected a bytesWritten signal, maybe it needs some event processing...

    >>> QApplication.processEvents()

Nope?

Important - must close the writer fd, otherwise the upcoming readAll
will block (unlike calling os.read directly):

    >>> qout.close()
    handler ()

Looks like the aboutToClose signal happened!

    >>> os.close(fdout)

Shouldn't this be 5L rather than 0L?

    >>> qin.bytesAvailable()
    0L

    >>> str(qin.readAll())
    'hello'

No sign of the readReady signal, maybe it's tied to event processing?

    >>> QApplication.processEvents()

Nope!

Tidy up:
    >>> qin.close()
    >>> os.close(fdin)




_______________________________________________
PyQt mailing list    [email protected]
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to