[Qgis-developer] how to run an external program from QGIS and catch its output?

Hugo Ledoux h.ledoux at tudelft.nl
Tue Mar 18 01:59:55 PDT 2014

I’m developing a plugin and I want to call an external program that
takes as input a string and outputs a string. Under Mac and Linux I
successfully used subprocess.Popen() but under Windows it doesn’t
work. For instance, from a Python console inside QGIS under Mac/Linux:

import subprocess
p = subprocess.Popen(['ls', '-al'], stdout=subprocess.PIPE)
print p.stdout.read()
total 17101
drwxr-xr-x   35 root  wheel     1258 Mar 13 09:11 .
drwxr-xr-x   35 root  wheel     1258 Mar 13 09:11 ..
-rw-rw-r--@   1 root  admin     6148 Dec  6 12:13 .DS_Store
d--x--x--x    8 root  wheel      272 Nov  5 10:02 .DocumentRevisions-V100

But under Windows if I try to catch the output (which is a requirement for me) :
import subprocess
p = subprocess.Popen(['dir'], shell=True, stdout=subprocess.PIPE)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\PROGRA~1\QGISVA~1\apps\Python27\lib\subprocess.py", line
703, in __init__
    errread, errwrite) = self._get_handles(stdin, stdout, stderr)
  File "C:\PROGRA~1\QGISVA~1\apps\Python27\lib\subprocess.py", line
839, in _get_handles
    p2cread = self._make_inheritable(p2cread)
  File "C:\PROGRA~1\QGISVA~1\apps\Python27\lib\subprocess.py", line
878, in _make_inheritable
WindowsError: [Error 6] The handle is invalid

What’s the best way to call a program and catching the output (a
string) under Windows?

Many thanks,

More information about the Qgis-developer mailing list