【发布时间】:2013-03-15 08:23:12
【问题描述】:
我有一个脚本,我在其中使用 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
【问题讨论】:
-
进程不能改变它的PID。
-
查看amoffat.github.com/sh。这就是我推荐在 python 中使用子进程的方式。其他方式可以解析 ps -aux | 的 bash 响应。 grep 'process_name'
-
@Jason 显示你得到的实际代码和错误!让我们猜测您何时没有给我们SSCCE 表明问题是浪费时间。顺便说一句,拒绝访问错误与您的描述不符。我认为您根本无权终止该进程。
-
@Bakuriu 我绝对有权利。如果我不等待,我可以杀死它,但在这种情况下,程序运行的时间不够长,无法完成它必须做的事情。当我等待时,问题是 pid 与 proc.pid 存储的不同。事实上,proc 的 pid 甚至没有显示为进程,WinSCP 的 pid 完全不同。
标签: python process subprocess popen pid