A while ago I wrote a script/algorithm to load a non standard data file with the help of another executable, which basically did:
#process string s and extract data into a new workspace
It worked OK then (Nov 2014) but fails now with “[Error 6] The handle is invalid”.
On investigation this seems to be a general Windows/Python bug and there is a work around using
There’s still a problem: it pops up a console window (which is blank as the output goes elsewhere) and the window then disappears once the subprocess finishes. This is most annoying as it also grabs keyboard focus, especially if I embed that algorithm in another longer running script and let it get on with processing while I do something else. Is there a better way to do this?
There is a suggestion here that it is possible to use the
startupinfo argument to
check_output (the Python docs page suggests that
check_output takes most arguments that
Popen does and pass a flag to turn off the window.
Does something like this work for you situation:
startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW s=subprocess.check_output(["command",datafilename],stdin=subprocess.PIPE, stderr=subprocess.PIPE, startupinfo=startupinfo)
I had already found a rather similar looking workaround elsewhere on the web:
That works and doesn’t pop up windows. It’s Windows only of course - might yours be portable, assuming of course that “command” is available on the other platforms?
I think this unfortunately gets into the realm of operating system specifics and it looks like the whole
startupinfo structure is a Windows-only feature so it looks like there isn’t a cross-platform way to do this in Python. However, I believe the default on the other platforms is not to create a separate window to run the command.
I can confirm that this is the case on Linux with the following code:
import subprocess as subp
if sys.platform == "win32":
startupinfo = subp.STARTUPINFO()
startupinfo.dwFlags |= subp.STARTF_USESHOWWINDOW
startupinfo = None
s = subp.check_output(["ls", "bin"], stdin=subp.PIPE, stderr=subp.PIPE, startupinfo=None)