Python: quando usare pty.fork () contro os.fork ()
Domanda
Sono incerto se usare o pty.fork()
os.fork()
quando la deposizione delle uova processi in background esterni dal mio app. (Come ad esempio i motori di scacchi)
Voglio che i processi generati a morire se il genitore viene ucciso, come con le applicazioni di deposizione delle uova in un terminale.
Quali sono gli alti e bassi tra le due forchette?
Soluzione
Il processo figlio creato con os.fork()
eredita stdin / output / error dal processo principale, mentre il bambino creato con pty.fork()
è collegato al nuovo pseudo terminale. È necessario il più tardi, quando si scrive un programma come xterm: pty.fork()
nel processo genitore restituisce un descrittore per controllare terminale del processo figlio, in modo da poter rappresentare visivamente i dati da esso e tradurre le azioni degli utenti in sequenze di input del terminale
Aggiornamento:
Da PTY (7) pagina man:
Un processo che prevede di collegare ad un terminale, può aprire la parte slave di una pseudo-terminale e poi essere azionata da un programma che ha ha aperto la parte master. Tutto ciò che è scritto sul lato master è fornito al processo sullo slave fine come se fosse stato digitato input su un terminale. Ad esempio, scrivendo il interrompere carattere (solitamente Controllo-C) al dispositivo master causerebbe un segnale di interrupt (SIGINT) da generato per la gruppo processo in primo piano che è connessa allo slave. Al contrario, tutto ciò che è scritto nel parte slave della lattina pseudo-terminale essere letta dal processo che è collegata alla parte master.
Altri suggerimenti
In passato ho sempre usato il modulo subprocess
per questo. Esso fornisce una buona API per comunicare con i sottoprocessi.
È possibile utilizzare call(*popenargs, **kwargs)
per bloccare l'esecuzione di loro, e credo che utilizzando la classe Popen
in grado di gestire l'esecuzione asincrona.
Controlla la docs per maggiori informazioni.
Per quanto usando os.fork
vs pty.fork
, entrambi sono altamente dipendenti dalla piattaforma, e né funzionerà (o almeno è testato) con finestre. Il modulo pty
sembra essere più vincolata dei due leggendo la documentazione. La differenza principale è l'aspetto pseudo terminale. Quindi, se non si è disposti a architetto il codice in un modo tale da essere in grado di utilizzare il modulo subprocess
, probabilmente sarei andare con os.fork
invece di pty.fork
.
Pseudotermials sono necessarie per alcune applicazioni che realmente si aspettano un terminale. Una shell interattiva è uno di questi esempi, ma ci sono molti altri. L'opzione pty.fork non è lì come un altro os.fork ma come un'API specifica per utilizzare una pseudoterminal.