Help on PyQt4 QProcess

Discussion in 'Python' started by Edgar Fuentes, Aug 19, 2011.

  1. Dear friends,

    I need execute an external program from a gui using PyQt4, to avoid
    that hang the main thread, i must connect the signal "finished(int)"
    of a QProcess to work properly.

    for example, why this program don't work?

    from PyQt4.QtCore import QProcess
    pro = QProcess() # create QProcess object
    pro.connect(pro, SIGNAL('started()'), lambda
    x="started":print(x)) # connect
    pro.connect(pro, SIGNAL("finished(int)"), lambda
    x="finished":print(x))
    pro.start('python',['hello.py']) # star hello.py program
    (contain print("hello world!"))
    timeout = -1
    pro.waitForFinished(timeout)
    print(pro.readAllStandardOutput().data())

    output:

    started
    0
    b'hello world!\n'

    see that not emit the signal finished(int)

    I'm using Python 3.2 and PyQt 4.8.4 under winxp 32bit.


    best regards,
    Edgar Fuentes, Aug 19, 2011
    #1
    1. Advertising

  2. On Fri, 19 Aug 2011 10:15:20 -0700 (PDT), Edgar Fuentes
    <> wrote:
    > Dear friends,
    >
    > I need execute an external program from a gui using PyQt4, to avoid
    > that hang the main thread, i must connect the signal "finished(int)"
    > of a QProcess to work properly.
    >
    > for example, why this program don't work?
    >
    > from PyQt4.QtCore import QProcess
    > pro = QProcess() # create QProcess object
    > pro.connect(pro, SIGNAL('started()'), lambda
    > x="started":print(x)) # connect
    > pro.connect(pro, SIGNAL("finished(int)"), lambda
    > x="finished":print(x))
    > pro.start('python',['hello.py']) # star hello.py program
    > (contain print("hello world!"))
    > timeout = -1
    > pro.waitForFinished(timeout)
    > print(pro.readAllStandardOutput().data())
    >
    > output:
    >
    > started
    > 0
    > b'hello world!\n'
    >
    > see that not emit the signal finished(int)


    Yes it is, and your lambda slot is printing "0" which is the return code
    of the process.

    Phil
    Phil Thompson, Aug 19, 2011
    #2
    1. Advertising

  3. On Aug 19, 1:56 pm, Phil Thompson <> wrote:
    > On Fri, 19 Aug 2011 10:15:20 -0700 (PDT), Edgar Fuentes
    >
    >
    >
    >
    >
    >
    >
    >
    >
    > <> wrote:
    > > Dear friends,

    >
    > > I need execute an external program from a gui using PyQt4, to avoid
    > > that hang the main thread, i must connect the signal "finished(int)"
    > > of a QProcess to work properly.

    >
    > > for example, why this program don't work?

    >
    > >    from PyQt4.QtCore import QProcess
    > >    pro = QProcess() # create QProcess object
    > >    pro.connect(pro, SIGNAL('started()'), lambda
    > > x="started":print(x))        # connect
    > >    pro.connect(pro, SIGNAL("finished(int)"), lambda
    > > x="finished":print(x))
    > >    pro.start('python',['hello.py'])        # star hello.py program
    > > (contain print("hello world!"))
    > >    timeout = -1
    > >    pro.waitForFinished(timeout)
    > >    print(pro.readAllStandardOutput().data())

    >
    > > output:

    >
    > >    started
    > >    0
    > >    b'hello world!\n'

    >
    > > see that not emit the signal finished(int)

    >
    > Yes it is, and your lambda slot is printing "0" which is the return code
    > of the process.
    >
    > Phil


    Ok, but the output should be:

    started
    b'hello world!\n'
    finished

    no?.

    thanks Phil
    Edgar Fuentes, Aug 19, 2011
    #3
  4. Edgar Fuentes

    Carl Banks Guest

    On Friday, August 19, 2011 12:55:40 PM UTC-7, Edgar Fuentes wrote:
    > On Aug 19, 1:56 pm, Phil Thompson
    > wrote:
    > > On Fri, 19 Aug 2011 10:15:20 -0700 (PDT), Edgar Fuentes
    > > <> wrote:
    > > > Dear friends,

    > >
    > > > I need execute an external program from a gui using PyQt4, to avoid
    > > > that hang the main thread, i must connect the signal "finished(int)"
    > > > of a QProcess to work properly.

    > >
    > > > for example, why this program don't work?

    > >
    > > >    from PyQt4.QtCore import QProcess
    > > >    pro = QProcess() # create QProcess object
    > > >    pro.connect(pro, SIGNAL('started()'), lambda
    > > > x="started":print(x))        # connect
    > > >    pro.connect(pro, SIGNAL("finished(int)"), lambda
    > > > x="finished":print(x))
    > > >    pro.start('python',['hello.py'])        # star hello.py program
    > > > (contain print("hello world!"))
    > > >    timeout = -1
    > > >    pro.waitForFinished(timeout)
    > > >    print(pro.readAllStandardOutput().data())

    > >
    > > > output:

    > >
    > > >    started
    > > >    0
    > > >    b'hello world!\n'

    > >
    > > > see that not emit the signal finished(int)

    > >
    > > Yes it is, and your lambda slot is printing "0" which is the return code
    > > of the process.
    > >
    > > Phil

    >
    > Ok, but the output should be:
    >
    > started
    > b'hello world!\n'
    > finished
    >
    > no?.
    >
    > thanks Phil


    Two issues. First of all, your slot for the finished function does not have the correct prototype, and it's accidentally not throwing an exception because of your unnecessary use of default arguments. Anyway, to fix that, try this:

    pro.connect(pro, SIGNAL("finished(int)"), lambda v, x="finished":print(x))

    Notice that it adds an argument to the lambda (v) that accepts the int argument of the signal. If you don't have that argument there, the int argument goes into x, which is why Python prints 0 instead of "finished".

    Second, processess run asynchrously, and because of line-buffering, IO can output asynchronously, and so there's no guarantee what order output occurs.. You might try calling the python subprocess with the '-u' switch to force unbuffered IO, which might be enough to force synchronous output (depending on how signal/slot and subprocess semantics are implemented).


    Carl Banks
    Carl Banks, Aug 19, 2011
    #4
  5. On Aug 19, 4:21 pm, Carl Banks <> wrote:
    > On Friday, August 19, 2011 12:55:40 PM UTC-7, Edgar Fuentes wrote:
    > > On Aug 19, 1:56 pm, Phil Thompson
    > >  wrote:
    > > > On Fri, 19 Aug 2011 10:15:20 -0700 (PDT), Edgar Fuentes
    > > > <> wrote:
    > > > > Dear friends,

    >
    > > > > I need execute an external program from a gui using PyQt4, to avoid
    > > > > that hang the main thread, i must connect the signal "finished(int)"
    > > > > of a QProcess to work properly.

    >
    > > > > for example, why this program don't work?

    >
    > > > >    from PyQt4.QtCore import QProcess
    > > > >    pro = QProcess() # create QProcess object
    > > > >    pro.connect(pro, SIGNAL('started()'), lambda
    > > > > x="started":print(x))        # connect
    > > > >    pro.connect(pro, SIGNAL("finished(int)"), lambda
    > > > > x="finished":print(x))
    > > > >    pro.start('python',['hello.py'])        # star hello..py program
    > > > > (contain print("hello world!"))
    > > > >    timeout = -1
    > > > >    pro.waitForFinished(timeout)
    > > > >    print(pro.readAllStandardOutput().data())

    >
    > > > > output:

    >
    > > > >    started
    > > > >    0
    > > > >    b'hello world!\n'

    >
    > > > > see that not emit the signal finished(int)

    >
    > > > Yes it is, and your lambda slot is printing "0" which is the return code
    > > > of the process.

    >
    > > > Phil

    >
    > > Ok, but the output should be:

    >
    > >     started
    > >     b'hello world!\n'
    > >     finished

    >
    > > no?.

    >
    > > thanks Phil

    >
    > Two issues.  First of all, your slot for the finished function does nothave the correct prototype, and it's accidentally not throwing an exception because of your unnecessary use of default arguments.  Anyway, to fix that, try this:
    >
    > pro.connect(pro, SIGNAL("finished(int)"), lambda v, x="finished":print(x))
    >
    > Notice that it adds an argument to the lambda (v) that accepts the int argument of the signal.  If you don't have that argument there, the int argument goes into x, which is why Python prints 0 instead of "finished".
    >
    > Second, processess run asynchrously, and because of line-buffering, IO can output asynchronously, and so there's no guarantee what order output occurs.  You might try calling the python subprocess with the '-u' switch to force unbuffered IO, which might be enough to force synchronous output (depending on how signal/slot and subprocess semantics are implemented).
    >
    > Carl Banks


    Thanks Carl, your intervention was very helpful for me, this solve my
    semantic error. I need to study more about signal/slots and process.
    Edgar Fuentes, Aug 19, 2011
    #5
  6. On Fri, 19 Aug 2011 14:32:12 -0700 (PDT), Edgar Fuentes
    <> wrote:
    > On Aug 19, 4:21 pm, Carl Banks <> wrote:
    >> On Friday, August 19, 2011 12:55:40 PM UTC-7, Edgar Fuentes wrote:
    >> > On Aug 19, 1:56 pm, Phil Thompson
    >> >  wrote:
    >> > > On Fri, 19 Aug 2011 10:15:20 -0700 (PDT), Edgar Fuentes
    >> > > <> wrote:
    >> > > > Dear friends,

    >>
    >> > > > I need execute an external program from a gui using PyQt4, to

    avoid
    >> > > > that hang the main thread, i must connect the signal
    >> > > > "finished(int)"
    >> > > > of a QProcess to work properly.

    >>
    >> > > > for example, why this program don't work?

    >>
    >> > > >    from PyQt4.QtCore import QProcess
    >> > > >    pro = QProcess() # create QProcess object
    >> > > >    pro.connect(pro, SIGNAL('started()'), lambda
    >> > > > x="started":print(x))        # connect
    >> > > >    pro.connect(pro, SIGNAL("finished(int)"), lambda
    >> > > > x="finished":print(x))
    >> > > >    pro.start('python',['hello.py'])        # star hello.py

    program
    >> > > > (contain print("hello world!"))
    >> > > >    timeout = -1
    >> > > >    pro.waitForFinished(timeout)
    >> > > >    print(pro.readAllStandardOutput().data())

    >>
    >> > > > output:

    >>
    >> > > >    started
    >> > > >    0
    >> > > >    b'hello world!\n'

    >>
    >> > > > see that not emit the signal finished(int)

    >>
    >> > > Yes it is, and your lambda slot is printing "0" which is the return
    >> > > code
    >> > > of the process.

    >>
    >> > > Phil

    >>
    >> > Ok, but the output should be:

    >>
    >> >     started
    >> >     b'hello world!\n'
    >> >     finished

    >>
    >> > no?.

    >>
    >> > thanks Phil

    >>
    >> Two issues.  First of all, your slot for the finished function does not
    >> have the correct prototype, and it's accidentally not throwing an
    >> exception because of your unnecessary use of default arguments.

     Anyway,
    >> to fix that, try this:
    >>
    >> pro.connect(pro, SIGNAL("finished(int)"), lambda v,
    >> x="finished":print(x))
    >>
    >> Notice that it adds an argument to the lambda (v) that accepts the int
    >> argument of the signal.  If you don't have that argument there, the int
    >> argument goes into x, which is why Python prints 0 instead of

    "finished".
    >>
    >> Second, processess run asynchrously, and because of line-buffering, IO
    >> can output asynchronously, and so there's no guarantee what order

    output
    >> occurs.  You might try calling the python subprocess with the '-u'

    switch
    >> to force unbuffered IO, which might be enough to force synchronous

    output
    >> (depending on how signal/slot and subprocess semantics are

    implemented).
    >>
    >> Carl Banks

    >
    > Thanks Carl, your intervention was very helpful for me, this solve my
    > semantic error. I need to study more about signal/slots and process.


    In which case you should look at the modern, Pythonic connection syntax
    rather than the old one...

    pro.started.connect(lambda: print("started"))
    pro.finished.connect(lambda: print("finished"))

    Phil
    Phil Thompson, Aug 20, 2011
    #6
  7. On Aug 20, 4:36 am, Phil Thompson <> wrote:
    > On Fri, 19 Aug 2011 14:32:12 -0700 (PDT), Edgar Fuentes
    >
    >
    >
    >
    >
    >
    >
    >
    >
    > <> wrote:
    > > On Aug 19, 4:21 pm, Carl Banks <> wrote:
    > >> On Friday, August 19, 2011 12:55:40 PM UTC-7, Edgar Fuentes wrote:
    > >> > On Aug 19, 1:56 pm, Phil Thompson
    > >> >  wrote:
    > >> > > On Fri, 19 Aug 2011 10:15:20 -0700 (PDT), Edgar Fuentes
    > >> > > <> wrote:
    > >> > > > Dear friends,

    >
    > >> > > > I need execute an external program from a gui using PyQt4, to

    > avoid
    > >> > > > that hang the main thread, i must connect the signal
    > >> > > > "finished(int)"
    > >> > > > of a QProcess to work properly.

    >
    > >> > > > for example, why this program don't work?

    >
    > >> > > >    from PyQt4.QtCore import QProcess
    > >> > > >    pro = QProcess() # create QProcess object
    > >> > > >    pro.connect(pro, SIGNAL('started()'), lambda
    > >> > > > x="started":print(x))        # connect
    > >> > > >    pro.connect(pro, SIGNAL("finished(int)"), lambda
    > >> > > > x="finished":print(x))
    > >> > > >    pro.start('python',['hello.py'])        # star hello.py

    > program
    > >> > > > (contain print("hello world!"))
    > >> > > >    timeout = -1
    > >> > > >    pro.waitForFinished(timeout)
    > >> > > >    print(pro.readAllStandardOutput().data())

    >
    > >> > > > output:

    >
    > >> > > >    started
    > >> > > >    0
    > >> > > >    b'hello world!\n'

    >
    > >> > > > see that not emit the signal finished(int)

    >
    > >> > > Yes it is, and your lambda slot is printing "0" which is the return
    > >> > > code
    > >> > > of the process.

    >
    > >> > > Phil

    >
    > >> > Ok, but the output should be:

    >
    > >> >     started
    > >> >     b'hello world!\n'
    > >> >     finished

    >
    > >> > no?.

    >
    > >> > thanks Phil

    >
    > >> Two issues.  First of all, your slot for the finished function does not
    > >> have the correct prototype, and it's accidentally not throwing an
    > >> exception because of your unnecessary use of default arguments.

    >  Anyway,
    > >> to fix that, try this:

    >
    > >> pro.connect(pro, SIGNAL("finished(int)"), lambda v,
    > >> x="finished":print(x))

    >
    > >> Notice that it adds an argument to the lambda (v) that accepts the int
    > >> argument of the signal.  If you don't have that argument there, the int
    > >> argument goes into x, which is why Python prints 0 instead of

    > "finished".
    >
    > >> Second, processess run asynchrously, and because of line-buffering, IO
    > >> can output asynchronously, and so there's no guarantee what order

    > output
    > >> occurs.  You might try calling the python subprocess with the '-u'

    > switch
    > >> to force unbuffered IO, which might be enough to force synchronous

    > output
    > >> (depending on how signal/slot and subprocess semantics are

    > implemented).
    >
    > >> Carl Banks

    >
    > > Thanks Carl, your intervention was very helpful for me, this solve my
    > > semantic error. I need to study more about signal/slots and process.

    >
    > In which case you should look at the modern, Pythonic connection syntax
    > rather than the old one...
    >
    >     pro.started.connect(lambda: print("started"))
    >     pro.finished.connect(lambda: print("finished"))
    >
    > Phil


    Pythonic, great!, more straightforward.

    Thanks again Phil and Carl.

    best regards,

    Edgar Fuentes
    Edgar Fuentes, Aug 22, 2011
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. aljosa
    Replies:
    0
    Views:
    510
    aljosa
    Jul 1, 2005
  2. Harshad

    Drag and Drop with PyQt4

    Harshad, Aug 25, 2006, in forum: Python
    Replies:
    2
    Views:
    1,213
    Harshad
    Aug 26, 2006
  3. ookrin
    Replies:
    2
    Views:
    6,401
    ookrin
    Apr 18, 2009
  4. wgw
    Replies:
    1
    Views:
    457
  5. Neil Wallace

    Re: Help with PyQt4 tabwidget setup

    Neil Wallace, May 24, 2010, in forum: Python
    Replies:
    0
    Views:
    677
    Neil Wallace
    May 24, 2010
Loading...

Share This Page