Python 需要删除批处理文件吗
好的,我已经在很多网站上搜索了几天了。如果某处有答案,如果你指给我看,那就好了。我试图让批处理文件“A”读取文本文件“B”,获取一些信息并替换批处理文件“C”中的代码。在第一次运行时,它将执行此操作,然后运行批处理文件“C”。当批处理文件“C”正在运行时,我有批处理文件“A”监视文本文件“B”,以查看文件最后修改部分的更改。当检测到更改时,我需要停止批处理文件“C”,将文本文件“B”读/写到批处理文件“C”,然后再次启动批处理文件“C” 除了每次检测到更改时运行批处理文件“A”时,它会启动一个新的批处理文件“C”运行外,我的代码可以完成所有工作 要启动批处理文件“C”,我使用:Python 需要删除批处理文件吗,python,windows,batch-file,cmd,Python,Windows,Batch File,Cmd,好的,我已经在很多网站上搜索了几天了。如果某处有答案,如果你指给我看,那就好了。我试图让批处理文件“A”读取文本文件“B”,获取一些信息并替换批处理文件“C”中的代码。在第一次运行时,它将执行此操作,然后运行批处理文件“C”。当批处理文件“C”正在运行时,我有批处理文件“A”监视文本文件“B”,以查看文件最后修改部分的更改。当检测到更改时,我需要停止批处理文件“C”,将文本文件“B”读/写到批处理文件“C”,然后再次启动批处理文件“C” 除了每次检测到更改时运行批处理文件“A”时,它会启动一个新
我尝试过使用p.terminate()和p.kill(),但两者都不起作用。谢谢大家的帮助。在windows上,我使用它,它工作正常。也可以通过直接调用win32 api来完成
os.system ("taskkill /F /PID "+str (p.pid))
p是您的子进程popen对象
编辑:这不起作用,可能是因为start
前缀。您需要创建一个python线程并在real命令上运行Popen。这里有一个有效的例子
我创建了一个类,所以不需要全局变量(我讨厌它们)。它创建一个线程,该线程一旦通过start()
启动,就会执行Popen
。它运行一个可执行文件,因此不需要shell=True
,但对于.bat文件,您可能需要它。
它将p对象存储在私有的\u管道属性中并等待
doit
方法在启动线程后等待5秒钟,然后使用您尝试的命令终止管道
与您尝试的不同之处在于,它不需要windowsstart
命令,而是使用python在后台运行,因此它可以更好地控制进程(start
只是启动进程并停止,您没有关于进程的信息)
使用Python3.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()
我插入了您的代码,但它似乎没有做任何事情,因为我对python有点陌生,在运行批处理文件之前,我是否应该更改一些内容?注意:我的subprocess.popen是p=在我的文件中,您正在运行cmd/c“start cmd/c:\Users\james\Documents\FollowMeMap.bat”
,因为shell=True
。为什么不直接运行批处理文件而不使用shell=True
?如果需要新的控制台窗口,请使用p=subprocess.Popen(r'C:\Users\james\Documents\FollowMeMap.bat',creationflags=subprocess.CREATE\u new\u console)
。与此类似,processp
是执行“FollowMeMap.bat”的实际cmd.exe实例,您可以p.kill()
。
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()