2011-08-11 3 views
1

J'ai un tas de code qui utilise l'ancienne obsolète popen du paquet platform. Comme ceci est obsolète, je vais le déplacer vers le paquet subprocess.Portage de platform.popen à subprocess.Popen?

Quelle est l'instruction équivalente à popen("some_command")? Y a-t-il une raison pour laquelle Popen était obsolète?

+0

c'est simple. Lisez la [documentation] (http://docs.python.org/library/subprocess.html) – JBernardo

+0

La documentation explique comment elle remplace os.popen, pas platform.popen. Une déclaration régulière est simplement "platform.popen (" python some_script.py ")" – coffee

+1

fait-il * une * différence? – JBernardo

Répondre

0
  • platform.popen n'a pas été déprécié du mieux que je peux dire. Cependant, il s'agit d'une fonction de bas niveau que vous ne devez pas utiliser pour des raisons de flexibilité et de portabilité. Beaucoup d'autres choses de lancement de processus ont été abandonnées et certaines ont été supprimées dans Python 3. Beaucoup, beaucoup de tentatives ont été faites dans l'histoire de Python, et subprocess.Popen et ses fonctions pratiques sont de loin les meilleures. Après son existence les autres sont devenus cruels et la plupart des retenus sont juste là pour supporter le code hérité.

  • Si vous allez au port votre code pour utiliser le module subprocess, ne cherchez pas un équivalent exact à ce que vous avez fait, ou vous manquerez sur la façon dont il vaut mieux . Lisez et comprenez la documentation subprocess et comprenez les idées qu'il utilise pour résoudre le problème du lancement de processus mieux que les alternatives plus anciennes. Comment est subprocess.Popen mieux que les alternatives plus anciennes?

    • Il est sécurisé. Au lieu de something('shell command here'), nous faisons Popen(['shell', 'command', 'here']). Cela ne lance pas un processus de shell inutile, ce qui le rend moins dangereux et dangereux. Considérez si j'ai demandé à l'utilisateur de saisir son nom. Je pourrais écrire something('foo %s" % name) dans la vieille chose. Cela devrait fonctionner - si l'utilisateur vous donne le nom "Mike", alors il devient une commande comme foo Mike. Mais que se passe-t-il si le nom de l'utilisateur est "Mike Graham"? Ensuite, je veux foo 'Mike Graham'. Alors maintenant, je mets toujours dans les apostrophes, mais maintenant, que faire si le nom de l'utilisateur est "Mike O'Reilley"? Pire encore, que se passe-t-il si son nom est "Mike; rm -rf /"? La solution ici n'est pas d'essayer de vous échapper vous-même (ce qui est difficile à faire correctement, encore moins à faire multi-plateforme), mais de passer les arguments directement sans déranger avec le shell - Popen(['foo', name]) `.

    • Il est flexible. Vous pouvez contrôler complètement l'entrée et la sortie.

    • Il est non-bloquant.Popen peut exécuter un processus simultanément avec le vôtre.