Python - Использование os.popen () для анализа Unix "ls" - Проблемы с уничтожением дочернего процесса - PullRequest
0 голосов
/ 26 июля 2010

Насколько я понимаю, os.popen() открывает канал внутри Python и запускает новый подпроцесс.У меня проблема, когда я запускаю цикл for в сочетании с os.popen ().Я не могу казаться CTRL + C из цикла.Вот мой код:

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

Всякий раз, когда я пытаюсь CTRL + C , Python останавливает программу ./processFile, но НЕ саму программу python!

Iу Google есть и не могу найти правильный ответ.Некоторые люди рекомендуют использовать СИГНАЛЫ (я пытался ... это не сработало).Другой пытался использовать PID и убивать дочерние PID, но я никак не мог их получить.

Может ли кто-нибудь привести меня к лучшему примеру, чтобы я мог остановить программирование при использовании CTRL + C (SIGINT)?

Ответы [ 2 ]

4 голосов
/ 26 июля 2010

Я вижу правильный ответ, рекомендованный subprocess.check_call и ОП в комментарии сказал

Я получаю эту ошибку: AttributeError: у объекта 'module' нет атрибут 'check_call'

Согласно документам, на которые я только что ссылался, check_call помечается как:

Новое в версии 2.5.

так что похоже, что OP использует какую-то древнюю версию Python - 2.4 или более раннюю - без упоминания этого факта (текущая готовая к выпуску версия 2.7, а 2.4 уже много лет).

Лучше всего порекомендовать обновить ! Если 2.7 «слишком новый» для вашего вкуса (как это можно было бы считать в консервативном «магазине»), последний микролизинг 2.6 должен быть как минимум хорошим - и он не просто даст вам subprocess.check_call, но и множество дополнительных функций, исправлений ошибок и оптимизаций! -)

2 голосов
/ 26 июля 2010

Поведение правильное. Ctrl + C останавливает процесс переднего плана, а не его родительский процесс. Вызов оболочки и использование ls здесь неуместно, ваш код лучше написать следующим образом (не проверено):

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