Python: quand utiliser pty.fork () par rapport à os.fork ()
Question
Je suis certain que d'utiliser pty.fork()
ou os.fork()
lorsque les processus d'arrière-plan externes fraie de mon application. (Tels que les moteurs d'échecs)
Je veux que les processus donné naissance à mourir si le parent est tué, comme des applications de reproduction dans un terminal.
Quels sont les hauts et les bas entre les deux fourches?
La solution
Le processus enfant créé avec os.fork()
hérite stdin / stdout / stderr du processus parent, alors que l'enfant créé avec pty.fork()
est connecté à nouveau terminal pseudo. Vous avez besoin de plus tard, lorsque vous écrivez un programme comme xterm: pty.fork()
processus parent renvoie un descripteur terminal de contrôle du processus de l'enfant, afin que vous puissiez représenter visuellement les données qu'il contient et traduire les actions utilisateur en séquences d'entrée du terminal
Mise à jour:
De page man pty (7):
Un processus qui attend d'être connecté à un terminal, peut ouvrir l'extrémité esclave d'un pseudo-terminal et ensuite entraîné par un programme qui a ouvrir l'extrémité de maître. Tout ce que est écrit sur la fin principale est à condition que le procédé de l'esclave fin comme si elle était entrée dactylographiée sur un terminal. Par exemple, écrire le interrompre le caractère (généralement contrôle-C) au dispositif maître provoquerait un signal d'interruption (SIGINT) soit généré par la groupe de processus d'avant-plan qui est relié à l'esclave. Inversement, tout ce qui est écrit à la esclave extrémité de la boîte de pseudo-terminal être lu par le processus qui est connecté à l'extrémité maître.
Autres conseils
Dans le passé, j'ai toujours utilisé le module subprocess
pour cela. Il offre un bon api pour communiquer avec les sous-processus.
Vous pouvez utiliser call(*popenargs, **kwargs)
pour bloquer l'exécution d'entre eux, et je crois en utilisant la classe Popen
peut gérer l'exécution async.
Consultez la docs pour plus d'informations.
En ce qui concerne l'utilisation os.fork
vs pty.fork
, les deux sont très dépendant de la plateforme, et ne fonctionnera (ou au moins est testé) avec des fenêtres. Le module pty
semble être plus limitée des deux en lisant les documents. La principale différence étant l'aspect pseudo borne. Donc, si vous n'êtes pas prêt à l'architecte de votre code de telle manière à pouvoir utiliser le module subprocess
, je serais probablement aller avec os.fork
au lieu de pty.fork
.
Pseudotermials sont nécessaires pour certaines applications qui attendent vraiment un terminal. Un shell interactif est l'un de ces exemples, mais il y a beaucoup d'autres. L'option pty.fork est pas là comme une autre os.fork mais comme une API spécifique à utiliser un pseudoterminal.