pythonuser-interfaceconsolepopenpythonw

Running a process in pythonw with Popen without a console


I have a program with a GUI that runs an external program through a Popen call:

p = subprocess.Popen("<commands>" , stdout=subprocess.PIPE , stderr=subprocess.PIPE , cwd=os.getcwd())
p.communicate()

But a console pops up, regardless of what I do (I've also tried passing it NUL for the file handle). Is there any way to do that without getting the binary I call to free its console?


Solution

  • From here:

    import subprocess
    
    def launchWithoutConsole(command, args):
        """Launches 'command' windowless and waits until finished"""
        startupinfo = subprocess.STARTUPINFO()
        startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
        return subprocess.Popen([command] + args, startupinfo=startupinfo).wait()
        # or, starting with Python 3.7:
        # return subprocess.Popen([command] + args, startupinfo=subprocess.STARTUPINFO(dwFlags=subprocess.STARTF_USESHOWWINDOW)).wait()
    
    if __name__ == "__main__":
        # test with "pythonw.exe"
        launchWithoutConsole("d:\\bin\\gzip.exe", ["-d", "myfile.gz"])
    

    Note that sometimes suppressing the console makes subprocess calls fail with "Error 6: invalid handle". A quick fix is to redirect stdin, as explained here: Python running as Windows Service: OSError: [WinError 6] The handle is invalid