我正在尝试运行程序并为程序提供一个脚本:
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启动。
答案 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已完成“启动”。