Vous pouvez également les appeler via le subprocess
module, mais ...
Pour Python 2.7 et plus récent, utilisez simplement
subprocess.check_call(['open', filename])
Dans Python 3.5+, vous pouvez utiliser de manière équivalente le légèrement plus complexe mais aussi un peu plus polyvalent
subprocess.run(['open', filename], check=True)
Si vous avez besoin d'être compatible jusqu'à Python 2.4, vous pouvez utiliser subprocess.call()
et implémenter votre propre vérification d'erreur:
try:
retcode = subprocess.call("open " + filename, shell=True)
if retcode < 0:
print >>sys.stderr, "Child was terminated by signal", -retcode
else:
print >>sys.stderr, "Child returned", retcode
except OSError, e:
print >>sys.stderr, "Execution failed:", e
Maintenant, quels sont les avantages de l'utilisation subprocess
?
- Sécurité: en théorie, c'est plus sûr, mais en fait, nous devons exécuter une ligne de commande dans un sens ou dans l'autre; dans l'un ou l'autre environnement, nous avons besoin de l'environnement et des services pour interpréter, trouver des chemins, etc. Dans les deux cas, nous n'exécutons pas de texte arbitraire, il n'a donc pas de
'filename ; rm -rf /'
problème inhérent "mais vous pouvez taper ", et si le nom de fichier peut être corrompu, utiliser subprocess.call
nous donne peu de protection supplémentaire.
- Gestion des erreurs: Cela ne nous donne en fait plus de détection d'erreur, nous dépendons toujours de la
retcode
dans les deux cas; mais le comportement pour déclencher explicitement une exception en cas d'erreur vous aidera certainement à remarquer s'il y a un échec (bien que dans certains scénarios, un retraçage ne soit pas du tout plus utile que d'ignorer simplement l'erreur).
- Génère un sous-processus (non bloquant) : nous n'avons pas besoin d'attendre le processus enfant, car nous commençons par une déclaration de problème un processus séparé.
À l'objection «mais subprocess
est préféré». Cependant, os.system()
n'est pas obsolète, et c'est en quelque sorte l'outil le plus simple pour ce travail particulier. Conclusion: utiliser os.system()
est donc aussi une bonne réponse.
Un inconvénient majeur est que la start
commande Windows vous oblige à passer shell=True
ce qui annule la plupart des avantages de l'utilisation subprocess
.