mluebke código no es 100% correcto; kill() también puede generar EPERM (acceso denegado), en cuyo caso eso obviamente significa que existe un proceso. Esto se supone que funciona:
(editado de acuerdo con los comentarios de Jason R. Coombs)
import errno
import os
import sys
def pid_exists(pid):
"""Check whether pid exists in the current process table.
UNIX only.
"""
if pid < 0:
return False
if pid == 0:
# According to "man 2 kill" PID 0 refers to every process
# in the process group of the calling process.
# On certain systems 0 is a valid PID but we have no way
# to know that in a portable fashion.
raise ValueError('invalid PID 0')
try:
os.kill(pid, 0)
except OSError as err:
if err.errno == errno.ESRCH:
# ESRCH == No such process
return False
elif err.errno == errno.EPERM:
# EPERM clearly means there's a process to deny access to
return True
else:
# According to "man 2 kill" possible error values are
# (EINVAL, EPERM, ESRCH)
raise
else:
return True
No se puede hacer esto en Windows a menos que utilice pywin32, ctypes o un módulo de extensión C. Si estás bien con función de un lib externa puede utilizar psutil:
>>> import psutil
>>> psutil.pid_exists(2353)
True
Windows es un sistema operativo no estándar. Este tipo de cosas NO son portátiles. Sabiendo que no puedes tener ambas cosas, ¿cuál es tu prioridad? Elija uno como prioridad y edite la pregunta. –
@ S.Lott * Windows es un sistema operativo no estándar * Este es uno de los comentarios más tontos que he visto en SO ... –
@Piotr Dobrogost: ¿Puede proporcionar un código que maneje el estándar POSIX estándar UNIX y no POSIX? Windows? De ser así, proporcione una respuesta que (a) resuelva el problema y (b) aclare que Windows cumple de alguna manera con el estándar POSIX. –