[PySide] using QProcess to run python function

Frank Rueter | OHUfx frank at ohufx.com
Fri Jan 24 05:39:28 CET 2014


What you are suggesting is exactly how it works. Pyside will import the 
other python module and runs it's main function via one extra QThread.
That function will import other python code, some of which runs 
subprocess on the external program.
The latter has to report back to PySide and drive the debug output






On 24/01/14 17:30, Sean Fisk wrote:
> On Thu, Jan 23, 2014 at 10:39 PM, Frank Rueter | OHUfx 
> <frank at ohufx.com <mailto:frank at ohufx.com>> wrote:
>
>     I might have lead you on a wild goose chase:
>
>     I have working python code that calls external process (using
>     subprocess.Popen) and now I am writing a UI for it.
>
>     To get started I wrote a simple UI that connected to one of those
>     external programs directly to establish the frame work for the new
>     code and figure out how to properly handle the external programs
>     stdout and stderr, be able to display things and cancel it from
>     within my UI.
>     After getting all that to work I thought all I have to do is
>     connect to my actual python code rather than directly to the
>     external program, and that is where I assumed QProcess to be able
>     to do this, when instead I shuold simlpy switch to use QThread and
>     reire that to give me access to stdout, be able to cancel it etc.
>     So what I am trying to do is simply this:
>
>     PySide UI --- calls --> pure python --- calls --> pure python ---
>     calls --> external program
>
>     With the stdout of external program and the pure python apps being
>     piped into the PySide UI for processing.
>
> I assume each of these is in its own process:
>
> ||process|    | process |    | process |    |   process    |
> PySide UI -> pure Python -> pure Python -> external program|
>
> Since creating processes is somewhat expensive, have you considered 
> the following?
>
> ||              process                |    |   process    |
> PySide UI -> pure Python -> pure Python -> external program
>            ^              ^              ^
>         imports        imports       subprocess|
>
> This would be ideal if import is a possibility. Apologies for the 
> crude drawings :)
>
>
>
>     Sorry if I wasted your time :/
>
>
>
>
>     frank
>
>
>
>
>     On 24/01/14 16:22, Sean Fisk wrote:
>>
>>     Are you wanting to use |QProcess| or |QThread| because your GUI
>>     is blocked (aka frozen, not responding)?
>>
>>
>>
>>     --
>>     Sean Fisk
>>
>>
>>     On Thu, Jan 23, 2014 at 10:06 PM, Frank Rueter | OHUfx
>>     <frank at ohufx.com <mailto:frank at ohufx.com>> wrote:
>>
>>         Actually, it's dawning on me that QProcess may be the wrong
>>         thing to use here, I guess I should consider using QThread
>>         instead, seeing all the code I need to run is Python anyway!?
>>         I was just experimented with QProcess running the external
>>         programs directly for testing so I kinda got stuck in
>>         thinking this is the way to go (since I got it all wired up
>>         to my UI already).
>>
>>
>>
>>
>>
>>         On 24/01/14 15:42, Frank Rueter | OHUfx wrote:
>>>         Thanks Sean and Ryan,
>>>
>>>         I'm still not quite clear on how this ties into QProcess.start()
>>>         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'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  <mailto:PySide at qt-project.org>
>>>         http://lists.qt-project.org/mailman/listinfo/pyside
>>
>>
>>         _______________________________________________
>>         PySide mailing list
>>         PySide at qt-project.org <mailto: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/20140124/b2b54661/attachment.html>


More information about the PySide mailing list