【问题标题】:subprocess.popen pid changesubprocess.popen pid 更改
【发布时间】: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 完全不同。
  • @Jason 你查过thisthis 的相关问题了吗?

标签: python process subprocess popen pid


【解决方案1】:

这就是我最终做的;

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 中可能略有不同。

【讨论】:

    猜你喜欢
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多