subprocess.popen pid更改

时间:2013-03-25 18:13:16

标签: python process subprocess popen pid

我有一个脚本,我在其中使用subprocess.Popen来启动一个外部程序和process.kill()以便在它启动时立即杀死它。每次脚本试图杀死它时,我都会收到Windows错误[5](拒绝访问)。我意识到程序的pid在打开后实际上正在发生变化。有没有办法在Python中监视更改的过程,或只是检索新的pid?

以下是代码:

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

1 个答案:

答案 0 :(得分: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中,命令本身可能略有不同。