好的,我已经在很多网站上搜索了几天的答案。如果在某个地方有答案,如果你指出我就没事了。我正在尝试获取批处理文件" 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()但是都没有用。感谢大家的帮助。
答案 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()