Как убить процесс, созданный подпроцессом другой функцией? - PullRequest
0 голосов
/ 27 января 2019

Мне интересно, почему я не могу завершить пакетный файл, полученный из одной функции, с помощью другой функции.

Я пытаюсь управлять пакетным файлом на моем выделенном компьютере с помощью 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.')

Как я могу его убить?

1 Ответ

0 голосов
/ 27 января 2019

Я вызываю пакет через новый cmd.exe процесс.В некоторых случаях кажется, что команды в пакете выполняются в «фоновом режиме»:

import subprocess

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

Теперь пакет выполняется изолированно в новом процессе CMD, который можно легко убить с помощью taskkill /F /PID 1234 через Попен.

Примечание : вам может потребоваться указать полные пути к cmd.exe, taskkill.exe and your batch, в зависимости от того, как запускается ваш «основной скрипт».

...