2013-03-25 62 views
1

我有一個腳本,我使用subprocess.Popen啓動一個外部程序,然後process.kill()在啓動時立即殺死它。每次腳本嘗試殺死它時,我都會收到Windows錯誤[5](訪問被拒絕)。我意識到程序的pid在打開後實際上正在改變。有沒有一種方法可以在Python中監視進程的變化,或者只是檢索新的pid?subprocess.popen pid change

下面是代碼:

import subprocess 
import time 

proc = subprocess.Popen(Path/to/WinSCP.exe) 
time.sleep(2) 
proc.kill() 

錯誤:

Traceback (most recent call last): 
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__ 
return self.func(*args) 
File "C:\Path", line 231, in __call__ 
self.scpsetup() 
File "C:\Path", line 329, in scpsetup 
proc.kill() 
File "C:\Python27\lib\subprocess.py", line 1019, in terminate 
_subprocess.TerminateProcess(self._handle, 1) 
WindowsError: [Error 5] Access is denied 
+2

該進程無法更改其PID。 – wRAR 2013-03-25 18:20:36

+1

看看http://amoffat.github.com/sh。這就是我推薦在python中使用子進程的方式。其他方法可以解析ps -aux |的bash響應grep'process_name' – mihaicc 2013-03-25 18:21:31

+0

外部程序是否啓動了一些您可以告訴我們的知名知識?聽起來好像你的啓動過程啓動了另一個過程。 @ viper33m在Windows下會出現'Windows Error [5]'這個錯誤的聲音,這將會導致'ps'和'grep'出現。 – BergmannF 2013-03-25 18:22:29

回答

2

這是我落得這樣做;

import tempfile 
import subprocess 
import time 

# Create a temp file to receive output 
tf  = tempfile.NamedTemporaryFile(delete=False) 
output = open(tf.name, "w") 

# Open and close WinSCP 
subprocess.Popen(Path/To/WinSCP.exe) 
time.sleep(2) 
subprocess.call("TASKKILL /IM WinSCP.exe", stdout=output) 
tf.close() 

我以前用這種方法得到的問題是我無法隱藏命令的輸出。這可能不是最完美的方式,但它的工作原理。

另請注意,我正在使用Windows 8.我明白,在不同版本的Windows中,命令本身可能略有不同。