2012-02-28 68 views
0

我想運行的程序和飼料的程序腳本,例如:讓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:/ /stackoverflow.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

回答

1

在瀏覽了這個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

0

如果你說的「下一個命令/東西」是你想要的東西是'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

相關問題