2016-07-28 129 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'命令很方便,但也是邪惡的:) –