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

myzjeezk  于 11个月前  发布在  Windows
关注(0)|答案(5)|浏览(155)

我写了一些声明如下:

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

字符串
都会弹出一个控制台。
我怎样才能阻止它弹出控制台?

hsvhsicv

hsvhsicv1#

进程STARTUPINFO可以隐藏控制台窗口:

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

字符串
或者设置creation flags以禁止创建窗口:

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


上面的仍然是一个控制台进程,具有有效的控制台I/O句柄(通过在GetStdHandle返回的句柄上调用GetFileType来验证)。它没有窗口,也没有继承父进程的控制台(如果有的话)。
您可以更进一步,强制孩子根本没有控制台:

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


在这种情况下,子进程的标准句柄(即GetStdHandle)为0,但您可以将它们设置为打开的磁盘文件或管道,如subprocess.DEVNULL(3.3)或subprocess.PIPE

pod7payv

pod7payv2#

shell=True参数添加到子进程调用中。

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

字符串
或者,如果您不需要等待它,请使用subprocess.Popen而不是subprocess.call

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

yquaqz18

yquaqz183#

只需添加:subprocess.call('powershell.exe taskkill /F /IM exename.exe', shell=True)

tjrkku2a

tjrkku2a4#

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

ux6nzvsh

ux6nzvsh5#

尝试将扩展名从.py更改为.pyw
它基本上只是一个Python用户界面文件。所以它打开了一个没有命令行的新窗口。检查这个链接(filext.com/file-extension/PYW)

相关问题