Python - Utilizzo di os.popen() per analizzare Unix "ls" - Problemi con l'uccisione del processo figlio

StackOverflow https://stackoverflow.com/questions/3338033

Domanda

Dalla mia comprensione, os.popen() apre una pipe all'interno di Python e avvia un nuovo processo secondario.Ho un problema quando eseguo un ciclo for insieme a os.popen().Non riesco a CTRL+C fuori dal ciclo.Ecco il mio codice:

for FILE in os.popen("ls $MY_DIR/"):
    os.system("./processFile " + FILE)

Ogni volta che provo a CTRL+C , Python arresterà il programma ./processFile ma NON il programma Python stesso!

Ho cercato su Google in giro e non riuscivo a trovare la risposta corretta.Alcune persone consigliano di usare SIGNALS (ho provato... non ha funzionato).Un altro ha cercato di utilizzare i PID e di uccidere i PID dei bambini, ma non riuscivo a capirlo.

Qualcuno può guidarmi a un esempio migliore in modo da poter interrompere la programmazione quando uso CTRL+C (SIGINT) ?

È stato utile?

Soluzione

Vedo una risposta correttamente consigliata subprocess.check_call e l'OP in un commento ha detto

Ricevo questo errore: AttributeError: l'oggetto 'module' non ha attributo 'check_call'

Secondo i documenti a cui ho appena collegato, check_call è contrassegnato come:

Novità nella versione 2.5.

quindi sembra che l'OP stia usando una versione antica di Python - 2.4 o precedenti - senza menzionare il fatto (l'attuale versione pronta per la produzione è 2.7 e 2.4 ha molti anni).

Il meglio che si può consigliare, quindi, è l' aggiornamento !Se la 2.7 è "troppo nuova" per i tuoi gusti (come potrebbe essere considerata in un "negozio"), l'ultima microrelease della 2.6 dovrebbe almeno andare bene -- e non ti darà solo subprocess.check_call, ma anche molti altrifunzionalità, correzioni di bug e ottimizzazioni!-)

Altri suggerimenti

Il comportamento è corretto.Ctrl+C interrompe il processo in primo piano e non il suo processo padre.Chiamare la shell e usare ls non è appropriato qui, il tuo codice dovrebbe essere scritto meglio come segue (non testato):

import os
import subprocess
for fname in os.listdir(directory):
    path = os.path.join(directory, fname)
    subprocess.check_call(["./processFile", path])
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top