如何在使用os.system()或subprocess.call()时隐藏控制台?
我写了一些像下面这样的代码:
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
。