需要杀死批处理文件

时间:2016-07-28 19:49:18

标签: python windows batch-file cmd

好的,我已经在很多网站上搜索了几天的答案。如果在某个地方有答案,如果你指出我就没事了。我正在尝试获取批处理文件" A"阅读文本文件" B"并获取一些信息并替换批处理文件中的代码" C"。首次运行时,它将执行此操作,然后运行批处理文件" C"。批处理文件" C"正在运行,我有批处理文件" A"观看文本文件" B"用于更改文件的最后修改部分。当检测到更改时,我需要批处理文件" C"停止,读/写文本文件" B"批处理文件" C"然后开始批处理文件" C"试。

我有代码工作,除了我运行批处理文件" A"每次检测到更改时,它都会启动" C"。

的新批处理文件

启动批处理文件" C"我用:

import subprocess
    p = subprocess.Popen(r'start cmd /c C:\Users\james\Documents\FollowMeMap.bat', shell=True)

我试过使用p.terminate()和p.kill()但是都没有用。感谢大家的帮助。

1 个答案:

答案 0 :(得分:0)

在Windows上,我使用它,它工作正常。也可以直接调用win32 api来完成。

 os.system ("taskkill /F /PID "+str (p.pid))

P是你的子进程popen对象。

编辑:这可能因为start前缀而无效。你需要创建一个python线程并在真正的命令上运行Popen。这是一个有效的例子。

我创建了一个类,所以不需要全局变量(我讨厌它们)。它创建一个通过start()启动的线程执行Popen。它运行一个可执行文件,因此不需要shell=True,但对于.bat文件,您可能需要它。 它将p对象存储在私有__pipe属性中并等待。

doit方法在启动线程后等待5秒钟,然后使用您尝试的命令终止管道。

与你的尝试的不同之处在于它不需要windows start命令,而是使用python在后台运行,因此它可以更好地控制进程(start只是启动进程并且停止,您没有关于该过程的信息)

使用Python 3.4进行测试

import threading
import subprocess
import time

class Runner():
    def run_command(self):
        p = subprocess.Popen("notepad.exe")
        self.__pipe = p
        p.wait()

    def doit(self):
        t = threading.Thread(target=self.run_command)
        t.start()
        time.sleep(5)
        self.__pipe.terminate()

r = Runner()
r.doit()