2010-07-26 23 views
0

À ma connaissance, os.popen() ouvre un tube dans Python et lance un nouveau sous-processus. J'ai un problème quand je lance une boucle for en conjonction avec os.popen(). Je ne peux pas sembler à CTRL + C hors de la boucle. Voici mon code:Python - Utilisation de os.popen() pour analyser Unix "ls" - Problèmes avec Killing Child Process

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

Chaque fois que je tente de CTRL + C, Python arrêtera le programme ./processFile mais pas le programme python lui-même!

J'ai trouvé Google autour et je n'arrivais pas à trouver la bonne réponse. Certaines personnes recommandent d'utiliser SIGNALS (j'ai essayé ... cela n'a pas fonctionné). Un autre a essayé d'utiliser les PID et de tuer les PID des enfants, mais je n'arrivais pas à l'obtenir.

Quelqu'un peut-il me conduire à un meilleur exemple afin que je puisse arrêter la programmation quand j'utilise CTRL + C (SIGINT)?

+3

1. Ne jamais analyser la sortie de 'ls'. 2. Utilisez le module 'subprocess' à la place de' os.popen'. – Philipp

+1

@ user402642, voici la raison pour laquelle: http://mywiki.wooledge.org/ParsingLs – Anders

+0

Merci beaucoup! Je serai sûr de ne pas analyser ls dans le futur: D –

Répondre

4

Je vois une réponse recommandée correctement subprocess.check_call et l'OP dans un commentaire dit

I'm getting this error: AttributeError: 'module' object has no attribute 'check_call'

selon les documents que je viens liée à, check_call est marqué comme:

New in version 2.5.

il semble donc que l'OP utilise une ancienne version de Python - 2.4 ou plus tôt - sans mentionner le fait (la version prête pour la production actuelle est 2.7, et 2.4 a plusieurs années).

Le meilleur que l'on peut recommander, par conséquent, est de mise à jour! Si 2.7 est "trop ​​nouveau" pour vos goûts (comme on pourrait le considérer dans un "magasin" conservateur), la dernière microrelease de 2.6 devrait au moins être bien - et elle ne vous donnera pas seulement subprocess.check_call, mais aussi beaucoup d'autres feautures, corrections de bugs, et optimisations! -)

+0

Wow! merci, je vais mettre à jour maintenant! –

2

Le comportement est correct. Ctrl + C arrête le processus de premier plan et non son processus parent. L'appel de la coquille et en utilisant ls est inapproprié, votre code devrait mieux être écrit comme suit (non testé):

import os 
import subprocess 
for fname in os.listdir(directory): 
    path = os.path.join(directory, fname) 
    subprocess.check_call(["./processFile", path]) 
+0

Merci pour la réponse! J'essaie d'appeler subprocess.check_call mais maintenant je reçois cette erreur: AttributeError: objet « module » n'a pas d'attribut « check_call » Je suis en train de google les résultats en vain. –

+0

>>> pour fname dans os.listdir (os.environ [ 'PSIM_DATA']):
... path = os.path.join (os.environ [ 'PSIM_DATA'], fname)
... subprocess.check_call (["echo", chemin])


Donne-moi l'erreur –