Reputation: 911
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?
Upvotes: 30
Views: 21824
Reputation: 81
works on window 11
result = subprocess.run(['nslookup', '2.16.206.132'], shell=True, capture_output=True, text=True)
print(result.stdout)
The process is executed without open a shell-console. This runs much more faster as like with shell=False ... :)
The result is here:
Server: OpenWrt.lan
Address: 192.168.1.1
Name: a2-16-206-132.deploy.static.akamaitechnologies.com
Address: 2.16.206.132
Upvotes: 0
Reputation: 110108
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()
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
Upvotes: 39
Reputation: 129
According to Python 2.7 documentation and Python 3.7 documentation, you can influence how Popen
creates the process by setting creationflags
. In particular, the CREATE_NO_WINDOW
flag would be useful to you.
variable = subprocess.Popen(
"CMD COMMAND",
stdout = subprocess.PIPE, creationflags = subprocess.CREATE_NO_WINDOW
)
Upvotes: 6
Reputation: 91
This works nicely in the win32api. The other solutions were not working for me.
import win32api
chrome = "\"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\""
args = "https://stackoverflow.com"
win32api.WinExec(chrome + " " + args)
Upvotes: 1
Reputation: 1602
You might be able to just do subprocess.Popen([command], shell=False)
.
That's what I use anyways. Saves you all the nonsense of setting flags and whatnot. Once named as a .pyw or run with pythonw it shouldn't open a console.
Upvotes: -1