[PySide] using QProcess to run python function

Sean Fisk sean at seanfisk.com
Fri Jan 24 05:38:35 CET 2014


On Thu, Jan 23, 2014 at 10:44 PM, Frank Rueter | OHUfx <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 QThreads 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>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 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
>>>
>>>
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20140123/c88416fa/attachment.html>


More information about the PySide mailing list