2016-07-28 114 views
-1

好吧,我已经搜索了很多网站的答案几天了。如果某个地方有答案,如果你指出我没有问题。我试图让批处理文件“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

您正在运行'CMD/C “开始CMD/C C:\用户\詹姆斯\文档\ FollowMeMap.bat”',因为'壳= TRUE'。为什么不简单地运行没有'shell = True'的批处理文件?如果您需要新的控制台窗口,请使用'p = subprocess.Popen(r'C:\ Users \ james \ Documents \ FollowMeMap.bat',creationflags = subprocess.CREATE_NEW_CONSOLE)'。像这样,进程'p'是执行“FollowMeMap.bat”的实际cmd.exe实例,您可以'p.kill()'它。 – eryksun

回答

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() 
+0

我插入你的代码,它似乎没有做任何事情,因为我有点新的python,是否有什么我想运行批处理文件之前更改?注意:我的subprocess.popen在我的文件中是p = – MagicUsr87

+0

我的不好:这个'start'命令很方便,但也是邪恶的:) –