Utilice el módulo de subproceso Python 2.6 en Python 2.5
subprocess python-2.5 (6)
Me gustaría usar la versión del subproceso de Python 2.6, porque permite la función Popen.terminate () , pero estoy atrapado con Python 2.5. ¿Hay alguna forma razonablemente limpia de usar la versión más nueva del módulo en mi código 2.5? Algún tipo de from __future__ import subprocess_module
?
Bueno, Python es de código abierto, puedes tomar esa función pthread desde 2.6 y moverla a tu propio código o utilizarla como referencia para implementar la tuya.
Por razones que deberían ser obvias, no hay forma de tener un híbrido de Python que pueda importar porciones de versiones más nuevas.
Realmente no hay una gran manera de hacerlo. El subproceso se implementa en python (en lugar de C) por lo que podría posiblemente copiar el módulo en alguna parte y usarlo (con la esperanza, por supuesto, de que no use ninguna bondad 2.6).
Por otro lado, usted podría simplemente implementar lo que afirma hacer en el subproceso y escribir una función que envíe SIGTERM en * nix y llame a TerminateProcess en Windows. La siguiente implementación se ha probado en Linux y en una Win XP vm, necesitará las extensiones de Windows de Python :
import sys
def terminate(process):
"""
Kills a process, useful on 2.5 where subprocess.Popens don''t have a
terminate method.
Used here because we''re stuck on 2.5 and don''t have Popen.terminate
goodness.
"""
def terminate_win(process):
import win32process
return win32process.TerminateProcess(process._handle, -1)
def terminate_nix(process):
import os
import signal
return os.kill(process.pid, signal.SIGTERM)
terminate_default = terminate_nix
handlers = {
"win32": terminate_win,
"linux2": terminate_nix
}
return handlers.get(sys.platform, terminate_default)(process)
De esta forma, solo debe mantener el código de terminate
lugar del módulo completo.
Sé que esta pregunta ya ha sido respondida, pero por lo que vale, he usado el subprocess.py
que viene con Python 2.6 en Python 2.3 y ha funcionado bien. Si lees los comentarios en la parte superior del archivo dice:
# This module should remain compatible with Python 2.2, see PEP 291.
Si bien esto no responde directamente a su pregunta, puede valer la pena saberlo.
Las importaciones de __future__
realidad solo cambian las opciones del compilador, de modo que si bien puede convertirse en una declaración o hacer que los literales de cadena produzcan unicodes en lugar de strs, no puede cambiar las capacidades y características de los módulos en la biblioteca estándar de Python.
Aquí hay algunas maneras de finalizar procesos en Windows, tomados directamente de http://code.activestate.com/recipes/347462/
# Create a process that won''t end on its own
import subprocess
process = subprocess.Popen([''python.exe'', ''-c'', ''while 1: pass''])
# Kill the process using pywin32
import win32api
win32api.TerminateProcess(int(process._handle), -1)
# Kill the process using ctypes
import ctypes
ctypes.windll.kernel32.TerminateProcess(int(process._handle), -1)
# Kill the proces using pywin32 and pid
import win32api
PROCESS_TERMINATE = 1
handle = win32api.OpenProcess(PROCESS_TERMINATE, False, process.pid)
win32api.TerminateProcess(handle, -1)
win32api.CloseHandle(handle)
# Kill the proces using ctypes and pid
import ctypes
PROCESS_TERMINATE = 1
handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, process.pid)
ctypes.windll.kernel32.TerminateProcess(handle, -1)
ctypes.windll.kernel32.CloseHandle(handle)
Seguí la sugerencia de Kamil Kisiel sobre el uso de python 2.6 subprocess.py en python 2.5 y funcionó perfectamente. Para hacerlo más fácil, creé un paquete de distutils que puedes instalar fácilmente y / o incluir en buildout.
Para usar el subproceso de python 2.6 en el proyecto python 2.5:
easy_install taras.python26
en tu código
from taras.python26 import subprocess
en la construcción
[buildout]
parts = subprocess26
[subprocess26]
recipe = zc.recipe.egg
eggs = taras.python26