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

问题描述:

我想运行的程序和饲料的程序脚本,例如:让POPEN等待第一个命令完成,然后开始下一个

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

我的问题是,它需要的程序几秒钟的时间完成发射。所以当它启动Popen程序时会运行下一个命令,当然,因为程序没有启动并且运行出错。所以我的问题是我如何告诉Popen等待第一个应用程序运行然后执行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') 

SOLUTION

所以!由于jdi,问题已被解决!道具给他,因为他已经把这个问题困扰了我很长一段时间......非常感谢!

答:

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

+0

也许你在这里找到答案:。HTTP:/ /*.com/questions/8377391/running-subsequent-commands-within-python ...沿着这些线: from sub过程进口POPEN,PIPE P1 = POPEN([SCRIPT1,输入1],标准输出= PIPE) P2 = POPEN([SCRIPT2],标准输入= p1.stdout,标准输出= PIPE) p1.stdout.close() 对不起,我现在无法测试它。 – 2012-02-28 22:28:44

+0

调用程序的问题在于它在shell中打开程序,并从此期望用户输入。但我不想给它用户输入。我希望程序在Python脚本后面接受一个命令列表。这就是Popen的第二部分。 – user1159817 2012-02-28 22:38:23

+0

如果你以后要给它命令,为什么不把它们包含在你的'call'调用中:-)。或者有什么理由为什么你**有**使用'Popen'? – Ben 2012-02-28 22:43:32

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

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

...这行(我假设你实际上是分配给一个变量,要么阻止它,或检查其状态),是什么是启动非基于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() 
--------------------------- 

这是你会把你的核弹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,他想在一个子过程中启动脚本,这个子过程将充当核弹终端的服务器。然后,他将继续在他的代码中使用客户端类与他进行通信(他是自己托管一个服务器进程并与它通信的一个循环)

他的问题的解决方案是他需要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 2012-02-28 23:57:24

+0

首先你能解释你打算如何设置脚本吗?你的目标是简单地让它启动服务器并阻止? – jdi 2012-02-29 00:02:18

+0

说实话我并不确定。我一直在Nuke内做python一段时间,并知道没有问题,但外面的python ..我还是很新的。据我了解.communicate()块..或者说,它可以阻止。我不知道你的意思是设置我的脚本..如果你的意思是启动它,那么我在右键菜单中有一个命令,它运行这个python脚本,它会启动一个pyGui ..然后在用户输入运行nuke并为它提供一些nuke命令..这是我卡住的地方。我有服务器与核心gui打开..只是没有它打开 – user1159817 2012-02-29 00:14:00

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

根本没有办法控制nuke.exe从python方面做什么...你必须检查你的server.py exe完成“启动”。

+0

是的,我试图将'server.py'传递给nuke.exe。尽管..虽然我有点困惑,现在该怎么做..我不能通过nuke.exe被调用后的server.py,因为现在nuke python命令在shell中工作..任何想法如何将服务器传递给nuke? – user1159817 2012-02-28 23:30:47

+0

我不熟悉nuke ... – 2012-02-28 23:34:10

+0

嗯,这里是一个链接,我正在努力工作 https://github.com/Nvizible/NukeExternalControl大约一半下来是我想要做的:“Nuke -t /nukeExternalControl/server。 py“ – user1159817 2012-02-28 23:37:09