Заставьте Попена дождаться окончания первой команды и затем начать следующую - PullRequest
0 голосов
/ 29 февраля 2012

Я пытаюсь запустить программу и передать ей скрипт таким образом:

subprocess.Popen(['X:\\apps\\Nuke6.1v5\\Nuke6.1.exe', '-t', 'X:\\apps\\Scripts\NUKE\\nukeExternalControl\\server.py'])

Моя проблема в том, что для запуска программы требуется несколько секунд. Таким образом, во время запуска программа Popen запускает следующую команду и, конечно, потому что программа не запущена и работает из-за ошибок. Поэтому мой вопрос заключается в том, как я могу сказать Попену подождать, пока первое приложение запустится, ТО затем выполнить следующую часть Попен .. все получатели ??

UPDATE

    import nukeExternalControl.client

    np = subprocess.Popen(['X:\\apps\\Nuke6.1v5\\Nuke6.1.exe', '-t', 'X:\\apps\\Scripts\NUKE\\nukeExternalControl\\server.py'])


    print "Starting Nuke Server"

    conn = nukeExternalControl.client.NukeConnection()
    nuke = conn.nuke

    print "execute commands"

    nuke.root().knob('first_frame').setValue(1)
    nuke.root().knob('last_frame').setValue(10)

    read = nuke.createNode('CheckerBoard2')
    textFrame = nuke.createNode('Text')
    textShotName = nuke.createNode('Text')
    reformat = nuke.createNode('Reformat')
    write = nuke.createNode('Write')

1012 * РЕШЕНИЕ *

Так! Благодаря JDI проблема была решена! Рекомендую ему, потому что он довольно долго оставлял мне эту проблему ... большое спасибо!

ОТВЕТ:

Мне нужно было использовать time.sleep() после команды Popen, потому что мой сервер не ждал запуска nuke, прежде чем связаться с ним.

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

После просмотра readme для этого модуля nuke у меня возникает ощущение, что вы можете быть смущены тем, что на самом деле требуется для его использования.

subprocess.Popen(['X:\\apps\\Nuke6.1v5\\Nuke6.1.exe', '-t', 'X:\\apps\\Scripts\NUKE\\nukeExternalControl\\server.py'])

... Эта строка (которую я предполагаю, что вы фактически присваиваете переменную и либо блокируете ее, либо проверяете ее состояние), - это то, что требуется для запуска сервера без графического интерфейса с Nuke. Nuke, будучи интерпретатором Python, может запускать скрипт Python через nuke -t <script.py>, следовательно, вы используете его для запуска вашего серверного процесса. Это заблокирует и подождет, пока вы будете использовать клиентский класс для связи.

Что, похоже, отсутствует в вашем вопросе - это больше контекста о том, как именно вы пытаетесь запустить эту конфигурацию сервер / клиент. Если вы пытаетесь выполнить обе части в одном и том же сценарии, то вам нужно запустить серверный процесс, как вы делаете, затем, возможно, на секунду спать (серверный процесс запускается довольно быстро), а затем запустить клиентский код, который делает связь.

Обновление

Реально, есть два способа запустить серверный процесс, как это очень ясно изложено в файле readme:

To start a command sever whenever Nuke is launched, add the following lines
to your Nuke menu.py:
---------------------------
import nukeExternalControl.server
nukeExternalControl.server.nuke_command_server()
---------------------------

Это то, что вы бы поместили в файл nuke menu.py или запустили вручную, запустив приложение Nuke. Теперь ваше приложение будет работать на сервере и позволит клиентам подключаться.

Если вы не хотите использовать лицензию с графическим интерфейсом и поддерживать ее работу с соединениями с сервером, тогда вы используете другой метод из командной строки X:\apps\Nuke6.1v5\Nuke6.1.exe -t X:\apps\Scripts\NUKE\nukeExternalControl\server.py, который запускает сервер на основе терминала. Нет НИКАКОЙ причины, по которой я могу подумать, что вам нужно использовать подпроцесс для запуска сервера в вашем скрипте, когда они дают вам метод для его запуска.

Решение

После долгого разговора с ФП выяснилось, что он хотел сделать то, что предложила первая часть моего ответа. У него есть автономный скрипт, который хочет что-то сделать с помощью интерпретатора Python от Nuke (совершенно без головы без приложения с графическим интерфейсом Nuke). Используя этот сторонний модуль , он хочет запустить скрипт в подпроцессе, который будет действовать как сервер для терминала nuke. Затем он продолжит работу в своем коде для связи с ним с помощью класса клиента (он сам размещает серверный процесс и, скорее всего, использует циклический перебор).

Решением его проблемы было то, что ему нужно было time.sleep(2) сразу после Попена, который запускает его server.py. Ожидание нескольких секунд до полного запуска сервера позволило клиенту успешно подключиться.

И да, он теперь должен мне пиво.

0 голосов
/ 29 февраля 2012

Если вещь, на которую вы ссылаетесь, когда говорите «следующая команда / вещь», это 'X:\\apps\\Scripts\NUKE\\nukeExternalControl\\server.py', то вы совершенно сбиты с толку.Это аргумент командной строки , переданный nuke.exe (так же, как C:\ передается при выполнении dir C:\).

Просто нет способа контролировать, что nuke.exeделает со стороны Python ... вы должны проверить в server.py, что исполняемый файл завершен "загрузка".

...