如何杀死另一个函数由子进程创建的进程?

How to kill a process created by subprocess by another function?

我想知道为什么我无法通过使用另一个函数来终止从一个函数生成的批处理文件。

我想做的是通过 Telebot 在我的专用计算机上管理批处理文件。

我的 test.bat 文件:

title test.bat
timeout /t 999

我已经编写了一个单独的模块,其中包含启动和终止此批处理文件的功能:

from os import path, kill
import subprocess
import signal


TEST_PATH = 'C:\Users\Administrator\Desktop\TEST\'
un_proc = None 


class sidim(object):
    def __init__(self):
        pass

    def launch_test(self):
        test_proc = subprocess.Popen([path.join(TEST_PATH,
                                                'TEST.bat')],                                                                              
                          creationflags=subprocess.CREATE_NEW_CONSOLE)
        self.test_pid = test_proc.pid

    def kill_test(self):
        kill(self.test_pid, signal.SIGTERM)

当我使用 /start_test 命令启动批处理文件时,它工作正常并且批处理文件正常启动:

import telebot 
import sidimanager

bot = telebot.TeleBot('TOKEN')
sidim = sidimanager.sidim()


@bot.message_handler(commands=['start_test'])
def handle_start_test(message):
    sidim.launch_test()
    bot.reply_to(message, 'Test .bat file has been successfuly launched.')

但是当我试图用 /kill_test 命令终止这个批处理时,批处理文件会忽略它并继续工作:

@bot.message_handler(commands='kill_test')
def handle_kill_test(message):
    sidim.kill_test()
    bot.reply_to(message, 'Test .bat file has been successfuly killed.')

怎么杀掉它?

我正在通过新的 cmd.exe 流程调用批处理。在某些情况下,感觉批处理中的命令是 运行 in the 'background':

import subprocess

test_proc = subprocess.Popen(['cmd',  '/c',  'C:/temp/myBatch.bat'], creationflags=subprocess.CREATE_NEW_CONSOLE)
test_pid = test_proc.pid

现在您在新的 CMD 进程中隔离了批处理 运行,可以通过 Popen 使用 taskkill /F /PID 1234 轻松终止。

注意:您可能需要提供 cmd.exe, taskkill.exe and your batch 的完整路径,具体取决于 'main script' 的启动方式。