如何在使用os.system()或subprocess.call()时隐藏控制台?

81 投票
6 回答
84997 浏览
提问于 2025-04-16 23:15

我写了一些像下面这样的代码:

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

这两段代码都会弹出一个控制台窗口。

我该怎么做才能不让它弹出控制台呢?

6 个回答

0

只需要加上这一行代码:

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

这段代码的意思是通过 PowerShell 来强制结束一个叫做 "exename.exe" 的程序。你只需要把 "exename.exe" 替换成你想要关闭的程序名称就可以了。

31

在调用子进程时,加上 shell=True 这个参数。

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

或者,如果你不需要等待它完成,可以用 subprocess.Popen 来代替 subprocess.call

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

这个过程 STARTUPINFO 可以让控制台窗口隐藏起来:

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

或者可以设置一些 创建标志,这样就不会创建窗口了:

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

上面的方法仍然是一个控制台进程,它有有效的控制台输入输出句柄(可以通过调用 GetFileType 来验证这些句柄,使用 GetStdHandle 获取)。不过,它没有窗口,也不会继承父进程的控制台(如果有的话)。

你还可以更进一步,强制子进程完全不显示控制台:

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

在这种情况下,子进程的标准句柄(也就是 GetStdHandle)是0,但你可以把它们设置为一个打开的磁盘文件或者管道,比如 subprocess.DEVNULL(3.3版本)或者 subprocess.PIPE

撰写回答