Uso Python módulo 2.6 subprocesso em Python 2,5
-
23-08-2019 - |
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
?
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.