2013-09-19 6 views
0

Я хочу обработать выход из подпроцесса и решить завершить этот подпроцесс после получения достаточного вывода. Моя программная логика решает, когда у нас достаточно ввода.Как прервать подпроцесс, запущенный sh?

Пример: Подождите, пока событие Udev

try: 
    for event in sh.udevadm('monitor', _iter=True): 
    if event matches usb stick added: 
     print("Ok, I will work with that USB stick you just plugged in!") 
     break 
except: 
    pass 

print("I copy stuff on your USB stick now!") 

«перерыв» завершает процесс, но я не могу поймать исключение:

Unhandled exception

Что такое правильный способ прекратить подпроцесс или как я могу обработать исключение?

ответ

0

Найден способ с использованием интерактивных функций обратного вызова.

http://amoffat.github.io/sh/#interactive-callbacks

Довольно мило, я думаю.

def wait_for_plugged_in_drive(self): 
    print("Plugin an external HDD or USB stick.") 

    sh.udevadm.monitor(_out=self._scan_and_terminate).wait() 

def _scan_and_terminate(self, line, stdin, process): 

    match = re.search('add\\s+/.*/block/sd./(sd..)', line) 

    if match is not None: 

     self.device = '/dev/' + match.group(1) 
     print("USB stick recognized {0}".format(self.device)) 

     process.terminate() 
     return True 
1

Возможно, вам лучше использовать subprocess.Popen вместо sh.

Нечто похожее на:

$ cat udevtest.py 
import subprocess 

try: 
    proc = subprocess.Popen(["udevadm", "monitor"], stdout=subprocess.PIPE, 
                stderr=subprocess.STDOUT) 
    while True: 
     line = proc.stdout.readline() 
     if line == "" or len(line) == 0: 
      break # EOF 

     if line.find("pci0000") != -1: # your trigger 
      print("TRIGGER %s" % line.strip()) 
      break 

    proc.terminate() 
    proc.wait() 
except Exception, e: 
    print(e) 
+0

Приятно видеть, что альтернатива sh будет по-прежнему очень проста. – Alex

Смежные вопросы