2012-02-28 2 views
0

Я пытаюсь запустить программу и кормить программу сценарий как таковой:сделать Popen ждать первой команды, чтобы закончить затем начать следующий

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

Моя проблема заключается в том, что он принимает программу через несколько секунд закончить запуск. Поэтому при запуске программы Popen запускает следующую команду и, конечно, потому что программа не работает и работает, это ошибки. Поэтому мой вопрос заключается в том, как сообщить Popen, что ждать, пока первое приложение запустит THEN, выполните следующую часть 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') 

РЕШЕНИЕ

Так! Благодаря jdi проблема была опрокинута! Подкрепляет его, так как он долгое время оставил эту проблему со мной ... большое спасибо!

ОТВЕТ:

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

+0

Может быть, вы найдете здесь ответ:.. HTTP://stackoverflow.com/questions/8377391/running-subsequent-commands-within-python ... Что-то в этих строках: от sub Процесс импорта POPEN, ТРУБА р1 = Popen ([script1, вход1], стандартный вывод = ТРУБА) р2 = Popen ([Скрипт2], STDIN = p1.stdout, стандартный вывод = ТРУБА) p1.stdout.close() К сожалению , Я не могу проверить это прямо сейчас. –

+0

Проблема с вызовом программы заключается в том, что она открывает программу в оболочке, и с этой точки она ожидает ввода пользователем. Но я не хочу давать ему пользовательский ввод. Я хочу, чтобы программа взяла список команд позже по сценарию python. Для чего нужна вторая часть Попена. – user1159817

+0

Если вы собираетесь давать ему команды позже, почему бы вам просто не включить их в ваш вызов 'call' :-). Или есть какая-то причина, почему ** ** использовать ** Popen'? – Ben

ответ

1

После того, как взглянув на 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>, поэтому вы используете его для запуска процесса сервера. Это заблокирует и дождитесь, пока вы будете использовать ваш client class для связи.

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

Update

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

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() 
--------------------------- 

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

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

Решение

После продолжительного разговора с OP, то получается, что то, что он хотел сделать, это то, что первая часть моего ответа предложил. У него есть отдельный сценарий, который хочет что-то сделать с помощью интерпретатора Python от Nuke (полностью без головы без приложения Nuke GUI). Using this 3rd party module, он хочет запустить скрипт в подпроцессе, который будет выступать в качестве сервера для терминала nuke. Затем он перейдет в свой код, чтобы связаться с ним, используя класс клиента (он сам организует серверный процесс и сортирует кругооборот с ним.

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

И да, он должен мне пиво в настоящее время

+0

. Я думаю, что я знаю, что вы имеете в виду. Первоначально я настроил его как таковой: 'np = subprocess.Popen (['X: \\ apps \\ Nuke6.1v5 \\ Nuke6.1.exe', '- t', '' 'X: \\ apps \\ Scripts \ NUKE \\ nukeExternalControl \\ server.py']) ' ' np.communicate() ' Но это не сработало для меня .. вы имеете в виду что-то? Можете ли вы дать мне пример кода? – user1159817

+0

Сначала вы можете объяснить, как вы собираетесь настроить свой сценарий? Ваша цель - просто запустить сервер и заблокировать его? – jdi

+0

Если честно, я не уверен. Я делал python в Nuke некоторое время и знаю, что нет проблемы, кроме python снаружи. Я еще новичок. Насколько я понимаю .communicate() блоков ... или, скорее, он может блокировать. Я не уверен, что вы имеете в виду, настроив мой скрипт. Если вы хотите запустить его, то у меня есть команда в моем меню правой кнопки мыши, которая запускает этот скрипт python, который вызывает pyGui .. затем после ввода пользователем запускает nuke и кормит его некоторыми командами Nuke .., где я застрял. У меня есть сервер для работы с ядерными ядрами, которые открываются. Просто не без него. – user1159817

0

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

Нет простого способа контролировать то, что делает nuke.exe со стороны python ... вы должны проверить свой server.py, что exe закончил «загрузку».

+0

Да, я пытаюсь передать 'server.py' в файл nuke.exe. Bummer, хотя .. Я немного confuzzled относительно того, что делать теперь .. Я не могу передать server.py после nuke.exe был вызван, потому что теперь nuke python команды работают в оболочке с этой точки .. любые идеи, как передать сервер в ядерное оружие? – user1159817

+0

Я не знаком с ядерным оружием ... –

+0

Хм хорошо, вот ссылка на то, что я пытаюсь получить. https://github.com/Nvizible/NukeExternalControl примерно наполовину вниз - это то, что я пытаюсь сделать: «Nuke -t /nukeExternalControl/server. py " – user1159817

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