2014-12-19 2 views
2

Вопроса: Есть ли способ, с помощью Python, чтобы получить доступ к стандартному выводу запущенного процесса? Этот процесс имеет не был запущен Python.Доступ к процессу уже работает с Python

Контекст: Существует программа под названием mayabatch, что делает из изображений из файлов сцены 3D Maya. Если бы я запускал программу из командной строки, я видел сообщения о ходе работы от mayabatch. Иногда художники закрывают эти окна, оставляя движение незаметным до завершения программы. Это привело меня к этому пути, пытаясь прочитать его выступление после того, как оно было создано внешним процессом.

фона:

  • ОС: Windows 7 64-бит

Мои исследования до сих пор: я только нашел вопросы и ответы о том, как это сделать, если это было подпроцесс, используя модуль subprocess. Я также кратко посмотрел на psutil, но не смог найти способ прочитать «stdout» процесса.

Любая помощь была бы действительно оценена. Спасибо.

+2

Вы можете использовать сокет с заранее известным портом, и труба, он, если подключен, нет? – MeetTitan

+1

Использование собственных служб ОС - это будет проблемой и будет полностью зависеть от того, какую ОС вы используете. Но похоже, что проблема проще. Похоже, что 'mayabatch' имеет механизм, чтобы рассказать вам о состоянии уже запущенных программ ... и похоже, что это утилита командной строки. Зачем просто выполнять скрипт и выполнять его синтаксический анализ? – user590028

+1

В Linux вы можете (вроде) сделать это с помощью 'strace'. Возможно, есть эквивалент Windows? – jme

ответ

2

Я не думаю, что вы можете get to the stdout of a process outside of the code that created it

Ленивый путь только к трубе выход mayabatch в текстовый файл, а затем опрашивать текстовый файл периодически в собственном коде, так что это под вашим контролем, вместо того, чтобы заставлять вас ждать на трубе (что особенно тяжело для Windows, поскольку Windows select не работает с трубами, используемыми подпроцессом.

Я думаю, что это то, что майя делает и внутри: по умолчанию mayaBatch записывает свои результаты в файл с именем mayaRenderLog.txt в каталоге пользователя Maya.

Если вы работаете mayabatch из командной строки или файла летучей мыши, вы можете направить стандартный вывод в файл с > характером:

mayabatch.exe "file.ma" > log.txt 

Вы должны иметь возможность опрашивать этот текстовый файл из стандартного внешнего использования python, пока вы только открываете его для чтения. Преимущество этого заключается в том, что вы контролируете частоту, с которой вы проверяете файл.

OTOH Если вы делаете это с помощью python, это немного сложнее, если вы не возражаете против того, чтобы ваш скрипт python работал на холостом ходу, пока не завершится майабэтт. Обычный подпроцесс рецепт, который использует popen.communicate() собирается ждать конца-процесса возврата кода:

test = subprocess.Popen(["mayabatch.exe","filename.mb"], stdout=subprocess.PIPE) 
print test.communicate()[0] 

работает, но не сообщит, пока процесс не умирает.Но ты звонишь readlines на стандартный вывод текущего процесса будет инициировать процесс и представить его на одну строку за один раз:

test = subprocess.Popen(["mayabatch.exe","filename.mb"], stdout=subprocess.PIPE) 
reader = iter(test.subprocess.readlines, "") 
for line in reader: 
    print line 

Более дискуссионной here выход

+0

Спасибо за отличный ответ, как обычно, @ theodox. – kartikg3

+0

Я попробую эти и дам вам знать. Я уверен, что это лучшие способы для этого. – kartikg3

+0

Как, черт возьми, я позволил мне разместить две одинаковые копии? – theodox

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