[英]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.