Uso Python módulo 2.6 subproceso en Python 2.5
-
23-08-2019 - |
Pregunta
Me gustaría utilizar la versión del subproceso de Python 2.6, porque permite que el Popen.terminate () función, pero estoy atascado con Python 2.5. ¿Hay alguna manera razonablemente limpia para utilizar la versión más reciente del módulo en el código 2.5? Una especie de from __future__ import subprocess_module
?
Solución
Sé que esta pregunta ya ha sido contestada, sino por lo que vale la pena, he utilizado el subprocess.py
que se incluye con Python 2.6 en Python 2.3 y ha funcionado bien. Si has leído los comentarios en la parte superior del archivo que dice:
# This module should remain compatible with Python 2.2, see PEP 291.
Otros consejos
No hay realmente una gran manera de hacerlo. subproceso es implementado en Python ( a diferencia de C) por lo que posiblemente podría copiar el módulo en algún lugar y utilizarlo (por supuesto con la esperanza de que no utiliza ningún bondad 2.6).
Por otra parte usted puede simplemente poner en práctica lo que pretende hacer el subproceso y escribir una función que envía SIGTERM en * nix y llama TerminateProcess en Windows. La siguiente aplicación ha sido probado en Linux y en Windows XP VM, necesitará las extensiones pitón de Windows :
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 manera es suficiente para mantener el código terminate
en lugar de todo el módulo.
Si bien esto no responde directamente a su pregunta, puede ser vale la pena conocer.
Las importaciones de __future__
realidad sólo cambian las opciones del compilador, lo que si bien se puede convertir en una declaración con o hacer literales de cadena producen unicodes en lugar de los RTS, que no puede cambiar las capacidades y características de los módulos de la biblioteca estándar de Python.
He seguido Kamil Kisiel sugerencia en relación con el uso de Python 2.6 subprocess.py en Python 2.5 y funcionó perfectamente. Para hacerlo más fácil, he creado un paquete distutils que puede easy_install y / o incluir en buildout.
Para utilizar subproceso de pitón 2.6 en proyecto pitón 2.5:
easy_install taras.python26
en el código
from taras.python26 import subprocess
en buildout
[buildout]
parts = subprocess26
[subprocess26]
recipe = zc.recipe.egg
eggs = taras.python26
Aquí están algunas maneras de terminar los procesos en Windows, tomadas 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)
Bien Python es de código abierto, usted es libre de tomar esa función pthread entre 2,6 y moverlo en su propio código o utilizarlo como una referencia para implementar su propia cuenta.
Por razones que deberían ser obvias no hay manera de tener un híbrido de Python que puede importar porciones de nuevas versiones.