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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top