[PySide] using QProcess to run python function

Sean Fisk sean at seanfisk.com
Fri Jan 24 05:48:56 CET 2014


Oh, I see. I just misunderstood. Good luck with it!


--
Sean Fisk


On Thu, Jan 23, 2014 at 11:39 PM, Frank Rueter | OHUfx <frank at ohufx.com>wrote:

>  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>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>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 pygmentizecommand-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>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>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
>>>>> 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
>>>> http://lists.qt-project.org/mailman/listinfo/pyside
>>>>
>>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> PySide mailing listPySide at qt-project.orghttp://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/20140123/625543f0/attachment.html>


More information about the PySide mailing list