[PySide] using QProcess to run python function
Frank Rueter | OHUfx
frank at ohufx.com
Sat Jan 25 06:30:29 CET 2014
quick update:
I just learnt about connection types but those didn't help either in
this case:
http://qt-project.org/doc/qt-5/threads-qobject.html#signals-and-slots-across-threads
On 25/01/14 18:15, Frank Rueter | OHUfx wrote:
> And of course I ran into trouble :-D
> Here is my test code trying to ustilise QThread:
> http://pastebin.com/Q26Q9M1M
>
> The basic structure seems to work (the extra thread and the main
> thread are running at the same time), but my UI does not update
> according to the signal connections, e.g.:
> When the thread starts the progress bar is supposed to be shown, the
> "Do Work" button should be disabled, the "Cancel" button disabled.
> etc.
>
> I tried calling self.update() in the MainUI when the thread starts
> but to no avail.
> I'm sure I'm missing something obvious as usual.
>
> I tried to adhere to what I learnt on this list about threading and
> avoid sub-classing QThread.
>
> Cheers,
> frank
>
> On 24/01/14 17:41, Frank Rueter | OHUfx wrote:
>> Great, thanks. I shall adjust my code.
>> I am interested in seeing how you would go about it, but let me have
>> a go from scratch, I will be able to understand things much better
>> afterwards :)
>>
>> Cheers,
>> frank
>>
>>
>> On 24/01/14 17:38, Sean Fisk wrote:
>>> On Thu, Jan 23, 2014 at 10:44 PM, Frank Rueter | OHUfx
>>> <frank at ohufx.com <mailto:frank at ohufx.com>> wrote:
>>>
>>> Much appreciated but as I mentioned, I think I jumped the gun
>>> with my post and should be using QThread to hook the python code
>>> to my QProgressBar and debug output window (QTextEdit).
>>>
>>> That would be a correct way to use |QProgressBar|. Also, for
>>> subprocess output, I would consider using |QPlainTextEdit| instead
>>> of |QTextEdit| as is is more performant with high amounts of text.
>>>
>>> If you are interested, I just wrote an asynchronous module for
>>> PySide for the project on which I am currently working. It is based
>>> on Python's futures <http://pythonhosted.org/futures/> module and
>>> works great with Qt's signals/slots. Although the project is
>>> primarily closed-source, I would be happy to share the async
>>> implementation with you. I don't know if would fit your needs, but
>>> for us it's much easier than manually spawning |QThread|s and even
>>> easier than |QThreadPool|.
>>>
>>> Good luck!
>>>
>>> I will investigate that now
>>>
>>>
>>>
>>> On 24/01/14 16:08, Sean Fisk wrote:
>>>> On Thu, Jan 23, 2014 at 9:42 PM, Frank Rueter | OHUfx
>>>> <frank at ohufx.com <mailto:frank at ohufx.com>> wrote:
>>>>
>>>> Thanks Sean and Ryan,
>>>>
>>>> I'm still not quite clear on how this ties into
>>>> QProcess.start()
>>>>
>>>>
>>>> It doesn't tie in with |QProcess| at all. We're advising to
>>>> avoid using that :)
>>>>
>>>> I do have a if __name__ ... block in the script in question.
>>>> An example would certainly be awesome, but if it's less
>>>> hassle, explaining how your and Ryan's advise helps use
>>>> QProcess on a python module might already suffice. Maybe a
>>>> simlpe example says it all though?!
>>>>
>>>>
>>>> I will whip up a simple example for you, but it might take a
>>>> few hours (lots of stuff to do right now).
>>>>
>>>> I'm not using python 3 btw
>>>>
>>>> Thanks guys for your help!!
>>>>
>>>> frank
>>>>
>>>>
>>>> On 24/01/14 15:33, Sean Fisk wrote:
>>>>>
>>>>> Hi Frank,
>>>>>
>>>>> You should definitely avoid calling Python as a subprocess
>>>>> if you can. As far as Ryan's example, I agree with the |if
>>>>> __name__...| but I think that using the |imp| module is a
>>>>> bit overkill. I would recommend using Setuptool's
>>>>> |entry_points| keyword
>>>>> <http://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation>.
>>>>> Or distutils' |scripts| keyword
>>>>> <http://docs.python.org/2/distutils/setupscript.html#installing-scripts>,
>>>>> if you must.
>>>>>
>>>>> An example of a well-known Python package which does this
>>>>> is Pygments
>>>>> <https://bitbucket.org/birkenfeld/pygments-main>, which
>>>>> has a large "library" component but also comes with the
>>>>> |pygmentize| command-line script. The Pygments codebase is
>>>>> pretty large, so if you would like me to whip up a simpler
>>>>> example I'd be glad to do so.
>>>>>
>>>>> Cheers,
>>>>>
>>>>> --
>>>>> Sean Fisk
>>>>>
>>>>>
>>>>> On Thu, Jan 23, 2014 at 9:17 PM, Frank Rueter | OHUfx
>>>>> <frank at ohufx.com <mailto:frank at ohufx.com>> wrote:
>>>>>
>>>>> Sorry if I'm being thick, but I'm not quite
>>>>> understanding how this helps to connect a python
>>>>> function to qprocess?! All your code does is execute
>>>>> the script, right?!
>>>>> I can already call myscript.main() straight up, but
>>>>> maybe I'm missing the point as I'm unfamiliar with the
>>>>> imp module.
>>>>>
>>>>> Let me elaborate a little bit more:
>>>>> myscript.main() calls a bunch of other python scripts
>>>>> that (directly or through other scripts again) execute
>>>>> external programs to do some conversion work. Those
>>>>> external programs spit out their progress to stdout
>>>>> which I can see fine when I run myscript.main()
>>>>> manually in a python terminal.
>>>>>
>>>>> Now I need run myscript.main() via QProcess and grab
>>>>> stdout to do be able to show a progress bar as well as
>>>>> show stdout and stderr in a debug window inside my QT
>>>>> code.
>>>>>
>>>>>
>>>>> Cheers,
>>>>> frank
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On 24/01/14 14:58, Ryan Gonzalez wrote:
>>>>>> If you put an "if __name__ == '__main__'" and a main
>>>>>> functions, you could always import the script from
>>>>>> the GUI frontend. Example:
>>>>>>
>>>>>> myscript.py
>>>>>>
>>>>>> def main(argv):
>>>>>> do_cool_stuff()
>>>>>> return 0
>>>>>>
>>>>>> if __name__ == '__main__':
>>>>>> sys.exit(main(sys.argv))
>>>>>>
>>>>>> mygui.py(Python 2):
>>>>>>
>>>>>> import imp
>>>>>>
>>>>>> ...
>>>>>>
>>>>>> main = imp.load_module('myscript',
>>>>>> *imp.find_module('myscript'))
>>>>>>
>>>>>> main.main(my_argv)
>>>>>>
>>>>>> mygui.py(Python 3):
>>>>>>
>>>>>> import importlib.machinery
>>>>>>
>>>>>> main =
>>>>>> importlib.machinery.SourceFileLoader('myscript',
>>>>>> 'myscript.py').load_module('myscript')
>>>>>>
>>>>>> main.main(my_argv)
>>>>>>
>>>>>>
>>>>>> On Thu, Jan 23, 2014 at 7:48 PM, Frank Rueter | OHUfx
>>>>>> <frank at ohufx.com <mailto:frank at ohufx.com>> wrote:
>>>>>>
>>>>>> Hi all,
>>>>>>
>>>>>> I got a little code design question:
>>>>>>
>>>>>> I have a python script that does a lot of file
>>>>>> processing/converting/uploading etc and I'd like
>>>>>> to write a decent
>>>>>> interface for it now.
>>>>>> The main goal is to be able to show the user
>>>>>> detailed info about the
>>>>>> current step and progress as well as clean up
>>>>>> properly in case the whole
>>>>>> thing is cancelled.
>>>>>>
>>>>>> My existing python code needs to stay independent
>>>>>> of QT so any
>>>>>> application that supports python can use it.
>>>>>> I am wondering now how to best connect the python
>>>>>> script and the PySide
>>>>>> code. Should I just run the script as an argument
>>>>>> to the python
>>>>>> interpreter like I would with any other program?
>>>>>> E.g.:
>>>>>>
>>>>>> process = QtCore.QProcess(self)
>>>>>> process.start(<path_to_python>,
>>>>>> <path_to_python_script>)
>>>>>>
>>>>>> As simple as this seems, it feels odd to use
>>>>>> python to call itself as an
>>>>>> external program.
>>>>>>
>>>>>>
>>>>>> I'm happy to go that way but am curious how
>>>>>> others are doing this?!
>>>>>>
>>>>>> Cheers,
>>>>>> frank
>>>>>>
>>>>>> _______________________________________________
>>>>>> PySide mailing list
>>>>>> PySide at qt-project.org <mailto:PySide at qt-project.org>
>>>>>> http://lists.qt-project.org/mailman/listinfo/pyside
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Ryan
>>>>>> If anybody ever asks me why I prefer C++ to C, my
>>>>>> answer will be simple: "It's
>>>>>> becauseslejfp23(@#Q*(E*EIdc-SEGFAULT. Wait, I don't
>>>>>> think that was nul-terminated."
>>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> PySide mailing list
>>>>> PySide at qt-project.org <mailto:PySide at qt-project.org>
>>>>> http://lists.qt-project.org/mailman/listinfo/pyside
>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>>
>> _______________________________________________
>> PySide mailing list
>> PySide at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/pyside
>
>
>
> _______________________________________________
> PySide mailing list
> PySide at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/pyside
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20140125/1d080a05/attachment.html>
More information about the PySide
mailing list