【问题标题】:Can I close the CMD window that opened with subprocess.Popen in Python?我可以关闭在 Python 中使用 subprocess.Popen 打开的 CMD 窗口吗?
【发布时间】:2018-05-12 21:27:22
【问题描述】:

我有一个程序需要在新的 CMD 中运行小任务。 例如:

def main()
    some code
    ...
    proc = subprocess.Popen("start.bat")
    some code...
    proc.kill()

subprocess,Popen 打开一个新的 cmd 窗口并在其中运行“start.bat”。 proc.kill() 杀死进程但不关闭 cmd 窗口。 有没有办法关闭这个cmd窗口?

我想命名打开的 cmd 窗口,这样我就可以用命令杀死它:

/taskkill /f /im cmdName.exe

有可能吗?如果没有,你有什么建议?

编辑、添加最小、完整和可验证的示例:

a.py:

import subprocess,time
proc = subprocess.Popen("c.bat",creationflags=subprocess.CREATE_NEW_CONSOLE)
time.sleep(5)
proc.kill()

b.py

while True:
    print("IN")

c.bat

python b.py

【问题讨论】:

  • 为什么不用隐藏的 CMD 运行脚本?
  • 因为 CMD 将在后台保持活动状态。如果 main() 将被执行 100 次,那么我会让它们在任务管理器中全部空闲。
  • 无法复现,即使脚本中有pause,python在查杀时会关闭窗口。也许尝试minimal reproducible example 提供一个包含问题的示例 .bat 文件,以及你如何运行你的 python 程序。因为 python 在控制台中运行,所以不会打开新的控制台。只有使用 pythonw 才会这样做(并成功关闭它)
  • @Jean-FrançoisFabre 尝试在子进程中运行一个不会停止的脚本
  • @Jean-FrançoisFabre 你可以试试我添加的例子

标签: python cmd subprocess


【解决方案1】:

这是另一种方法

import subprocess
from subprocess import Popen,CREATE_NEW_CONSOLE
command ='cmd'
prog_start=Popen(command,creationflags=CREATE_NEW_CONSOLE)
pidvalue=prog_start.pid
#this will kill the invoked terminal
subprocess.Popen('taskkill /F /T /PID %i' % pidvalue)

【讨论】:

  • 没明白!!这会关闭调用的 cmd 提示符(也是多个)..我自己尝试过。
  • 我的错。您没有解释 /T 选项也会杀死孩子。那会奏效的。好的。不过,我会使用 check_call 作为 taskkill 命令。
  • 会检查
【解决方案2】:

这是子进程运行时的预期。你只是在杀死.bat 进程。

您可以使用psutil(第三方,使用pip install psutil 安装)计算子进程并杀死它们,如下所示:

import subprocess,time,psutil
proc = subprocess.Popen("c.bat",creationflags=subprocess.CREATE_NEW_CONSOLE)
time.sleep(5)

pobj = psutil.Process(proc.pid)
# list children & kill them
for c in pobj.children(recursive=True):
    c.kill()
pobj.kill()

用你的例子测试过,窗口在 5 秒后关闭

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2023-03-21
    • 1970-01-01
    • 2015-06-12
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多