Je voudrais utiliser la version de sous-processus de Python 2.6, car elle permet la fonction Popen.terminate(), mais je suis coincé avec Python 2.5. Existe-t-il une manière raisonnablement propre d'utiliser la version plus récente du module dans mon code 2.5? Une sorte de from __future__ import subprocess_module
?Utiliser le module de sous-processus Python 2.6 en Python 2.5
Répondre
Je sais que cette question a déjà été répondue, mais pour ce que ça vaut, j'ai utilisé le subprocess.py
fourni avec Python 2.6 dans Python 2.3 et ça a bien fonctionné. Si vous lisez les commentaires au début du fichier, il dit:
# This module should remain compatible with Python 2.2, see PEP 291.
PEP 291 est très utile à connaître. Merci! (lien, pour la commodité des autres: http://www.python.org/dev/peps/pep-0291/) J'ai décidé que votre réponse répondait à ma question plus précisément, même si les zacherates sont aussi très utiles. – xyz
Avertissement: ce n'est pas tout à fait vrai. L'implémentation du paramètre close_fds dans le module de sous-processus 2.6 utilise os.closerange(), ce qui est nouveau dans python 2.6 – itsadok
cela a sauvé ma journée! Je vous remercie :-) –
Bien Python est open source, vous êtes libre de prendre cette fonction pthread à partir de la version 2.6 et de la déplacer dans votre propre code ou de l'utiliser comme référence pour implémenter la vôtre.
Pour des raisons qui devraient être évidentes, il n'y a aucun moyen d'avoir un hybride de Python qui peut importer des parties de versions plus récentes.
Il n'y a pas vraiment un excellent moyen de le faire. sous-processus est implemented in python (par opposition à C) de sorte que vous pourriez éventuellement copier le module quelque part et l'utiliser (en espérant bien sûr qu'il n'utilise pas 2,6 bonté). D'autre part, vous pouvez simplement implémenter ce que les revendications de sous-processus à faire et écrire une fonction qui envoie SIGTERM sur * nix et appelle TerminateProcess sur Windows. La mise en œuvre suivante a été testé sur Linux et dans un Win XP vm, vous aurez besoin du python Windows extensions:
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 cette façon, il suffit de maintenir le code terminate
plutôt que l'ensemble du module.
Génial, merci beaucoup! 'ps aux' me dit que le processus est terminé après l'avoir terminé avec cette fonction, mais il semble que os.waitpid (process.pid, 0) prenne cela en compte. – xyz
Bien que cela ne répond pas directement à votre question, il peut être utile de le savoir. En fait, les modifications apportées à __future__
ne modifient que les options du compilateur. Ainsi, même si les chaînes de caractères génèrent des unicodes au lieu des chaînes, elles ne peuvent pas modifier les capacités et les fonctionnalités des modules de la bibliothèque standard Python.
J'ai compris, merci. Je ne le savais pas. – xyz
Voici quelques façons de mettre fin à des processus sous Windows, prises directement à partir 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)
I a suivi la suggestion de Kamil Kisiel concernant l'utilisation de python 2.6 subprocess.py dans python 2.5 et cela a fonctionné parfaitement. Pour le rendre plus facile, j'ai créé un paquet distutils que vous pouvez easy_install et/ou inclure dans le buildout.
Pour utiliser le sous-processus de Python 2.6 en python 2.5 projet: ne fonctionne pas de manière fiable
easy_install taras.python26
dans votre code
from taras.python26 import subprocess
à buildout
[buildout]
parts = subprocess26
[subprocess26]
recipe = zc.recipe.egg
eggs = taras.python26
- 1. Comment utiliser Numerical Python avec Python 2.6
- 2. Pylônes - utilisez Python 2.5 ou 2.6?
- 3. Problème de compatibilité Python 2.5 et 2.6 et Numpy
- 4. incompatibilité de journalisation Python entre 2.5 et 2.6
- 5. mysqldb sur python 2.6+ (win32)
- 6. Convertisseur Python 2.5 en Python 2.2
- 7. ctypes en Python 2.6 help
- 8. Réglez Snow Leopard pour utiliser Python 2.5 au lieu de 2.6
- 9. Problèmes sur un module de sélection sur Python 2.5
- 10. Turbogears 2.0 avec Python 2.6
- 11. Pylucene en Python 2.6 + MacOs Snow Leopard
- 12. Faire une façade en Python 2.5
- 13. Module HTTPSConnection manquant dans Python 2.6 sur CentOS 5.2
- 14. passer à Python 2.6.x
- 15. Est-il nécessaire d'apprendre Python 2.6 avec Python 3.0?
- 16. Exécution de Panda3D sur Python 2.6
- 17. Django et Python 2.6
- 18. prise Python 2.6 rétrocompatible exception
- 19. Installation du module python
- 20. Thread simple en Python 2.6 utilisant thread.start_new_thread()
- 21. Compile pyme pour Python 2.6
- 22. Python 2.6 + JCC + numéro de Pylucene
- 23. le formatage de la version Python plus tôt que 2.6
- 24. Ajout du support SSL à Python 2.6
- 25. Random in python 2.5 ne fonctionne pas?
- 26. Problème avec le module Python
- 27. Python 2.5 socket._fileobject est quoi dans Python 3.1?
- 28. Module Python SSH/SFTP?
- 29. Python: Aucun module nommé core.exceptions
- 30. VIM: Utilisez Python 2.5 avec vim 7.2
Popen.terminate() , J'ai trouvé. Faites attention. – Brandon