subprocess.popen进程ID变化

1 投票
1 回答
1564 浏览
提问于 2025-04-17 20:15

我有一个脚本,里面用subprocess.Popen来启动一个外部程序,然后用process.kill()几乎在启动后立刻把它杀掉。每次脚本尝试杀掉这个程序时,我都遇到Windows错误[5](访问被拒绝)。我发现程序的进程ID(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 个回答

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中,命令本身可能会有一些小的差别。

撰写回答