Python subprocess.popen pid更改

Python subprocess.popen pid更改,python,process,subprocess,popen,pid,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.sle

我有一个脚本,其中我使用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

这就是我最终要做的

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()
我以前遇到的类似方法的问题是,我无法隐藏命令的输出。这可能不是实现这一目标的最佳方式,但它确实有效


还请注意,我使用的是Windows8。我知道命令本身在不同版本的Windows中可能略有不同。

进程无法更改其PID。请查看。这就是我建议在python中使用子流程的方法。另一种方法是解析ps-aux | grep'process_name'@Jason的bash响应,显示实际代码和错误!让我们猜测你什么时候没有给我们一个能说明问题的答案是浪费时间的。顺便说一下,拒绝访问错误与您的描述不符。我认为你根本没有权利扼杀这个进程。@Bakuriu我绝对有权利。如果我不等待,我可以杀死它,但在这种情况下,程序运行的时间不够长,无法完成它必须完成的任务。当我等待时,问题是pid与proc.pid存储的不同。事实上,proc的pid甚至没有显示为一个进程,WinSCP的pid完全不同。@Jason,你检查过和相关的问题了吗?