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

Syn*_*pse 59 python windows console subprocess

我写了一些如下的陈述:

os.system(cmd) #do something
subprocess.call('taskkill /F /IM exename.exe')
Run Code Online (Sandbox Code Playgroud)

两者都会弹出一个控制台.

如何阻止它弹出控制台?

Ery*_*Sun 99

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

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

或者设置创建标志以禁用创建窗口:

CREATE_NO_WINDOW = 0x08000000
subprocess.call('taskkill /F /IM exename.exe', creationflags=CREATE_NO_WINDOW)
Run Code Online (Sandbox Code Playgroud)

以上仍然是一个控制台进程,其中包含有效的控制台I/O句柄(通过调用GetFileType返回的句柄进行验证GetStdHandle).它没有窗口,也没有继承父控制台,如果有的话.

你可以通过强迫孩子完全没有控制台来更进一步:

DETACHED_PROCESS = 0x00000008
subprocess.call('taskkill /F /IM exename.exe', creationflags=DETACHED_PROCESS)
Run Code Online (Sandbox Code Playgroud)

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

  • `creationflags=CREATE_NO_WINDOW` 似乎不是很便携 (3认同)
  • Python 3.7 现在有 [subprocess.CREATE_NO_WINDOW](https://docs.python.org/3/library/subprocess.html#subprocess.CREATE_NO_WINDOW) (3认同)
  • @Cyan,从什么意义上说`CREATE_NO_WINDOW` 不可移植?这是一个 Windows 问题,从 3.1 到 Windows 10,所有版本的 Windows NT 都应该支持这些标志。 (2认同)

Chr*_*gan 21

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

subprocess.call('taskkill /F /IM exename.exe', shell=True)
Run Code Online (Sandbox Code Playgroud)

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

subprocess.Popen('taskkill /F /IM exename.exe', shell=True)
Run Code Online (Sandbox Code Playgroud)

  • 不是一个好的解决方案 shell = True比你想要的更多,并且如果用户可以操作输入,则会打开安全问题. (6认同)
  • +1表示简洁.这种方式有子[配置`STARTUPINFO`你(http://hg.python.org/cpython/file/ab05e7dd2788/Lib/subprocess.py#l918).请注意,通过`cmd/c`运行只应与可信命令一起使用.在这种情况下,没关系. (3认同)