繁体   English   中英

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

[英]Make Popen wait for first command to finish then start next

我正在尝试运行一个程序,并向程序提供脚本如下:

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,这个问题才得以解决! 为他提供了支持,因为他已经将这个问题解决了我很多时间了……非常感谢!

回答:

我需要在Popen命令之后使用time.sleep() ,因为我的服务器在与之通信之前没有等待nuke的启动。

浏览了此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脚本,因此您正在使用它来启动服务器进程。 这将阻止并等待您使用客户端类进行通信。

您的问题似乎缺少的是有关如何准确尝试运行此服务器/客户端配置的更多上下文。 如果您尝试在同一脚本中完成这两个部分,那么您将需要按需启动服务器进程,然后可能需要睡眠一秒钟(服务器进程启动非常快),然后运行执行以下操作的客户端代码连接。

更新资料

实际上,有两种方法可以启动服务器进程,如自述文件中所述:

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使用其他方法X:\\apps\\Nuke6.1v5\\Nuke6.1.exe -t X:\\apps\\Scripts\\NUKE\\nukeExternalControl\\server.py ,它将启动基于终端的服务器。 没有理由让我想到您需要使用子进程来启动脚本中的服务器,因为它们已经为您提供了一种启动服务器的方法。

经过与OP的漫长交谈之后,事实证明他想做的就是我的回答的第一部分。 他有一个独立的脚本,希望使用Nuke的python解释器(无需Nuke GUI应用程序就完全没有头)来执行某些操作。 他希望使用第3方模块在一个子进程中启动脚本,该子进程将充当nuke终端的服务器。 然后,他将继续执行代码以使用客户端类与之通信(他正在自托管服务器进程,并与之进行了循环通信。

解决他的问题的方法是,在启动他的server.py的Popen之后,他需要time.sleep(2) 等待几秒钟,以使服务器完全启动,客户端才能成功连接。

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

如果说“ next command / thing”时要引用的内容是'X:\\\\apps\\\\Scripts\\NUKE\\\\nukeExternalControl\\\\server.py' ,那么您就很困惑。 这是传递给nuke.exe命令行参数 (与执行dir C:\\时传递C:\\方式相同)。

根本没有办法从python端控制nuke.exe功能……您必须在server.py中签入该exe文件已完成“启动”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM