How do I hide the console when I use os.system() or subprocess.call()?

I wrote some statements like below:

os.system(cmd) #do something
subprocess.call('taskkill /F /IM exename.exe')

both will pop up a console.

How can I stop it from popping up the console?

73051 次浏览

Try subprocess.Popen(["function","option1","option2"],shell=False).

The process STARTUPINFO can hide the console window:

si = subprocess.STARTUPINFO()
si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
#si.wShowWindow = subprocess.SW_HIDE # default
subprocess.call('taskkill /F /IM exename.exe', startupinfo=si)

Or set the creation flags to disable creating the window:

CREATE_NO_WINDOW = 0x08000000
subprocess.call('taskkill /F /IM exename.exe', creationflags=CREATE_NO_WINDOW)

The above is still a console process with valid handles for console I/O (verified by calling GetFileType on the handles returned by GetStdHandle). It just has no window and doesn't inherit the parent's console, if any.

You can go a step farther by forcing the child to have no console at all:

DETACHED_PROCESS = 0x00000008
subprocess.call('taskkill /F /IM exename.exe', creationflags=DETACHED_PROCESS)

In this case the child's standard handles (i.e. GetStdHandle) are 0, but you can set them to an open disk file or pipe such as subprocess.DEVNULL (3.3) or subprocess.PIPE.

Add the shell=True argument to the subprocess calls.

subprocess.call('taskkill /F /IM exename.exe', shell=True)

Or, if you don't need to wait for it, use subprocess.Popen rather than subprocess.call.

subprocess.Popen('taskkill /F /IM exename.exe', shell=True)

Try to change the extension from .py to .pyw

Its basically just a Python User Interface file. So it opens up a new Window without the command line. chech this link (filext.com/file-extension/PYW)

Just add: subprocess.call('powershell.exe taskkill /F /IM exename.exe', shell=True)