让Popen等待第一个命令完成然后开始下一个

时间:2012-02-28 22:19:08

标签: python command subprocess wait popen

我正在尝试运行程序并为程序提供一个脚本:

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

我的问题是程序需要几秒钟才能完成启动。因此,当它启动程序时,Popen运行下一个命令,当然因为程序没有运行并且运行错误。所以我的问题是如何告诉Popen等待第一个应用程序运行然后执行Popen的下一部分..任何接受者?

更新

    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因为我的服务器在与之通信之前没有等待nuke启动。

2 个答案:

答案 0 :(得分:1)

在浏览了这个nuke模块的自述文件之后,我感觉你可能会对使用它的实际需要感到困惑。

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

...这一行(我假设您实际上正在分配一个变量并阻止它或检查其状态)是使用Nuke启动非基于gui的服务器所需的。作为python解释器的Nuke可以通过nuke -t <script.py>运行python脚本,因此您正在使用它来启动服务器进程。这将阻止,并等待您使用client class进行通信。

您的问题中似乎缺少的是关于您如何正确尝试运行此服务器/客户端配置的更多上下文。如果您尝试在同一个脚本中执行这两个部分,那么您需要按原样启动服务器进程,然后可能会休眠一秒钟(服务器进程很快启动),然后运行生成的客户端代码连接。

<强>更新

实际上有两种启动服务器进程的方法,如自述文件中非常明确地概述:

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应用程序手动启动它。您的应用程序现在将运行服务器进程并允许客户端连接。

如果您不想使用GUI许可证并使其继续运行到服务器连接,那么您可以使用命令行中的另一种方法 X:\apps\Nuke6.1v5\Nuke6.1.exe -t X:\apps\Scripts\NUKE\nukeExternalControl\server.py,它启动终端 - 基于服务器。我没有理由认为你需要使用子进程来启动脚本中的服务器,因为它们已经为你提供了启动服务器的方法。

解决方案

在与OP进行了长时间的对话之后,事实证明他想要做的就是我的答案的第一部分所暗示的内容。他有一个独立的脚本,希望使用Nuke的python解释器做一些事情(没有Nuke GUI应用程序,完全无头)。 Using this 3rd party module,他希望在子进程中启动脚本,该子进程将充当nuke终端的服务器。然后他将使用客户端类继续他的代码与他进行通信(他自己托管一个服务器进程并与它进行循环通信。

他的问题的解决方案是,在Popen开始他的time.sleep(2)后,他需要server.py。等待几秒钟让服务器完全启动,允许客户端成功连接。

是的,他现在欠我一杯啤酒。

答案 1 :(得分:0)

如果你在说“下一个命令/事物”时遇到的事情是'X:\\apps\\Scripts\NUKE\\nukeExternalControl\\server.py',那么你很困惑。这是传递给nuke.exe命令行参数(与执行C:\时传递的dir C:\相同)。

根本无法控制nuke.exe从python端执行的操作...您必须在server.py检查exe已完成“启动”。