2015-12-03 3 views
0

Я знаю, что на этот вопрос был дан ответ перед этим Python popen command. Wait until the command is finished , но я не понимаю ответа и как я могу применить его к моему коду, поэтому, пожалуйста, не помещайте этот вопрос как прошу заранее, не помогая пожалуйста :)Команда Python popen shell ждет завершения подпроцесса

У меня есть функция, которая принимает команду оболочки и выполняет ее и возвращает переменные выходы.

Он отлично работает, за исключением того, что я не хочу, чтобы поток управления продолжался до полного завершения процесса. Причина этого в том, что я создаю образы с помощью инструмента командной строки imagemagick, и когда я пытаюсь получить к ним доступ к информации, вскоре после этого они неполны. Это мой код ..

def send_to_imagemagick(self, shell_command): 

    try: 
     # log.info('Shell command = {0}'.format(shell_command)) 
     description=os.popen(shell_command) 
     # log.info('description = {0}'.format(description))    
    except Exception as e: 
     log.info('Error with Img cmd tool {0}'.format(e)) 

    while True: 
     line = description.readline() 
     if not line: break 
     return line 

Спасибо большое @Ruben Это то, что я использовал, чтобы закончить ее так, она возвращает выходные правильно.

def send_to_imagemagick(self, shell_command): 

     args = shell_command.split(' ')  
     try:     
      description=Popen(args, stdout=subprocess.PIPE) 
      out, err = description.communicate() 
      return out 

     except Exception as e: 
      log.info('Error with Img cmd tool {0}'.format(e)) 
+2

Почему 'os.popen', а не' subprocess.popen'? Подпроцесс заменяет os.popen. И я думаю, вы хотите сделать это: 'description.communicate()' ждать, пока он не будет закончен. См. Https://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate – Noxeus

+0

Итак, как мне написать? как это ... description = subprocess.call ([shell_command]) – whoopididoo

+0

См. мой ответ .. – Noxeus

ответ

3

Использование subprocess.popen:

Этот модуль намерен заменить несколько старых модулей и функций.

Так что в вашем случае import subprocess , а затем использовать popen.communicate() ждать, пока ваша команда не закончена.

Для документации об этом см: here

Итак:

from subprocess import Popen 

def send_to_imagemagick(self, shell_command): 

    try: 
     # log.info('Shell command = {0}'.format(shell_command)) 
     description=Popen(shell_command) 
     description.communicate() 

     # log.info('description = {0}'.format(description))    
    except Exception as e: 
     log.info('Error with Img cmd tool {0}'.format(e)) 

    while True: 
     line = description.readline() 
     if not line: break 
     return line 
+0

Извините за ошибку в капитале :) – Noxeus

+0

'return line' или' yield line'? Также верно ли аргумент 'self'? –

+0

Я не знаю, спроси ОП. – Noxeus

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