Pergunta

Eu gostaria de usar versão do subprocesso Python 2.6 do, porque permite que o Popen.terminate () função , mas eu estou preso com Python 2.5. Existe alguma maneira razoavelmente limpa para usar a versão mais recente do módulo no meu código 2.5? Algum tipo de from __future__ import subprocess_module?

Foi útil?

Solução

Eu sei que esta pergunta já foi respondida, mas para o que vale a pena, eu usei o subprocess.py que vem com o Python 2.6 em Python 2.3 e é muito bem trabalhado. Se você ler os comentários no topo do arquivo que diz:

# This module should remain compatible with Python 2.2, see PEP 291.

Outras dicas

Não há realmente uma ótima maneira de fazê-lo. subprocesso é implementado em python ( em oposição a C), de modo que você pode conseguir copiar a algum lugar módulo e usá-lo (esperando é claro que ele não usa qualquer 2.6 bondade).

Por outro lado, você poderia simplesmente implementar o que reivindicações subprocesso de fazer e escrever uma função que envia SIGTERM em * nix e chama TerminateProcess no Windows. A seguinte implementação foi testado em Linux e em um Win XP vm, você vai precisar do python do Windows extensões :

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)

Dessa forma, você só tem que manter o código terminate vez de todo o módulo.

Enquanto isso não responder diretamente sua pergunta, pode valer a pena conhecer.

As importações provenientes __future__ na verdade apenas mudar as opções do compilador, por isso, enquanto ele pode se transformar com em uma declaração ou cordas make literais produzir Unicodes em vez de STRs, não pode alterar as capacidades e funcionalidades dos módulos da biblioteca padrão Python.

Eu segui a sugestão Kamil Kisiel relação ao uso de python 2.6 subprocess.py em Python 2.5 e funcionou perfeitamente. Para tornar mais fácil, eu criei um pacote distutils que você pode easy_install e / ou incluir no buildout.

Para usar subprocess de python 2.6 em Python 2.5 projeto:

easy_install taras.python26

em seu código

from taras.python26 import subprocess

no buildout

[buildout]
parts = subprocess26

[subprocess26]
recipe = zc.recipe.egg
eggs = taras.python26

Aqui estão algumas maneiras para acabar com processos no Windows, tiradas diretamente do 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)

Bem Python é open source, você é livre para tomar essa função pthread de 2,6 e movê-lo em seu próprio código ou usá-lo como uma referência para implementar o seu próprio.

Por razões que devem ser óbvias não há nenhuma maneira de ter um híbrido de Python que pode importar porções de versões mais recentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top