python subprocess python-2.5

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