簡體   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