human
J'ai besoin de pouvoir ouvrir un document en utilisant son application par défaut sous Windows et Mac OS. Fondamentalement, je veux faire la même chose que lorsque vous double-cliquez sur l'icône du document dans l'Explorateur ou le Finder. Quelle est la meilleure façon de le faire en Python
gpt
```open``` et ```start``` sont des commandes interpréteur pour Mac OS/X et Windows respectivement, pour faire cela.
Pour les appeler depuis Python, vous pouvez utiliser le module ```subprocess``` ou ```os.system()```. 
Voici les considérations sur lequel package utiliser :

* Vous pouvez les appeler via ```os.system```, qui fonctionne, mais...
Échappement : ```os.system``` ne fonctionne qu'avec les noms de fichiers qui n'ont pas d'espaces ou d'autres métacaractères de shell dans le chemin d'accès (par exemple ```A:\abc\def\a.txt```), sinon ils doivent être échappés. Il y a ```shlex.quote``` pour les systèmes de type Unix, mais rien de vraiment standard pour Windows. Peut-être voir aussi python, windows : parsing command lines with shlex

* MacOS/X : ```os.system("open " + shlex.quote(filename))```
* Windows : ```os.system("start " + filename)``` où, à proprement parler, ```filename``` devrait également être échappé.

* Vous pouvez également les appeler via le module ```subprocess```, mais...
Pour Python 2.7 et plus récent, utilisez simplement
```subprocess.check_call(['open', filename])
```
En Python 3.5+, vous pouvez utiliser de manière équivalente le code légèrement plus complexe mais aussi plus polyvalent
```subprocess.run(['open', filename], check=True)
```
Si vous avez besoin de compatibilité 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 d'utiliser ```subprocess``` ?

* Sécurité : En théorie, c'est plus sécurisé, mais en réalité, nous devons exécuter une ligne de commande d'une manière ou d'une autre ; dans les deux environnements, nous avons besoin de l'environnement et des services pour interpréter, obtenir des chemins, etc. Dans aucun des cas, nous n'exécutons de texte arbitraire, donc il n'y a pas de problème inhérent du type "mais vous pouvez taper ```'filename ; rm -rf /'```", et si le nom de fichier peut être corrompu, l'utilisation de ```subprocess.call``` ne nous offre que peu de protection supplémentaire.
* Gestion des erreurs : Cela ne nous donne pas réellement plus de détection d'erreurs, nous dépendons toujours du ```retcode``` dans les deux cas ; mais le comportement de lever explicitement une exception en cas d'erreur vous aidera certainement à remarquer s'il y a une défaillance (bien que dans certains scénarios, une trace de pile pourrait ne pas être plus utile que simplement ignorer l'erreur).
* Lance un processus enfant (non bloquant) : Nous n'avons pas besoin d'attendre le processus enfant, puisque selon l'énoncé du problème, nous démarrons 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 également une réponse correcte.
Un inconvénient marqué est que la commande Windows ```start``` vous oblige à passer ```shell=True```, ce qui annule la plupart des avantages de l'utilisation de ```subprocess```.