【问题标题】:How to kill a process created by subprocess by another function?如何通过另一个函数杀死由子进程创建的进程?
【发布时间】:2019-06-20 16:34:57
【问题描述】:

我想知道为什么我不能使用另一个函数终止从一个函数引发的批处理文件。

我要做的是通过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.')

我怎样才能杀死它?

【问题讨论】:

  • 你也可以显示批处理文件吗?
  • @MauriceMeyer,当然,但它只是一个占位符 .bat,以便多次重复使用它:title test.bat timeout /t 999
  • edit您的问题包含您的批处理文件。我们需要足够的细节来确定一个合适的答案。
  • @double-beep,完成,但我不认为批处理文件的内容是真正的问题。
  • 我也是,但如果你不把它发给我们,我们就不会这么认为。

标签: python subprocess terminate


【解决方案1】:

我正在通过新的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 进程中隔离批处理运行,可以通过 Popen 使用 taskkill /F /PID 1234 轻松杀死该进程。

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

【讨论】:

  • 抱歉,含糊其辞:Popen.kill
  • 谢谢,我已经尝试过这个def kill_test(self): command = ['TASKKILL', '/F', '/T', '/PID', str(self.pid)] subprocess.Popen(command),批处理终于死了。
猜你喜欢
  • 2013-12-18
  • 2016-08-23
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多