2012-02-28 10 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のおかげで、問題は消えてしまった!彼がこの問題をかなりの間私と一緒に抱きしめてしまったので、彼に小道具...ありがとう!

ANSWER:

私は私のサーバーがそれに通信する前に、開始するには核兵器を待っていなかったためPopenコマンドの後time.sleep()を使用する必要がありました。

+0

たぶん、あなたはここで答えを見つける:。。のhttp:/を/stackoverflow.com/questions/8377391/running-subsequent-commands-within-python ...これらの行に沿ったもの: サブプロセス輸入popenの、PIPE P1 = popenの([SCRIPT1、INPUT1]、STDOUT = PIPE) P2 = popenの([スクリプト2]、STDIN = p1.stdout、STDOUT = PIPE) p1.stdout.close()該当 、私は今それをテストすることはできません。 –

+0

プログラムを呼び出す際の問題は、シェルでプログラムを開き、そのポイントからユーザーの入力が必要になることです。しかし、私はそれにユーザーの入力を与えたくありません。私はプログラムが後でpythonスクリプトのコマンドのリストを取るしたい。それはPopenの第二の部分のためです。 – user1159817

+0

あなたがコマンドを後で与えるつもりなら、どうしても 'call'コールにそれらを含めないでください:-)。それとも、ポポンを使う**の理由がありますか? – Ben

答えて

1

このヌークモジュールのreadmeを読んだあと、実際に何が必要なのか混乱するかもしれません。

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

...、と非GUIベースのサーバーを起動するために必要なものである(私はあなたが実際にどちらかそれを阻止する、またはその状態をチェックし、変数に代入されていると仮定)この行ヌーク。 NukeはPythonインタプリタであり、 nuke -t <script.py>経由でPythonスクリプトを実行することができます。したがって、これを使用してサーバープロセスを開始します。これによりブロックされ、 client classを使用して通信するまでお待ちください。

あなたの質問には、このサーバー/クライアント構成をどのように実行しようとしているかについてのより多くの文脈がありません。同じスクリプトで両方の部分を実行しようとしている場合は、実行中にサーバープロセスを開始してから1秒間スリープ状態にする必要があります(サーバープロセスは非常に早く始まります)。接続。

更新

非常にはっきりREADMEに概説されているよう現実的には、サーバー・プロセスを開始するには、2つの方法が、あります

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アプリケーションでこれを手動で開始することもできます。これで、アプリケーションはサーバープロセスを実行し、クライアントの接続を許可します。

あなたは、あなたが端末ベースのサーバーを起動するコマンドラインX:\apps\Nuke6.1v5\Nuke6.1.exe -t X:\apps\Scripts\NUKE\nukeExternalControl\server.pyから他の方法を使用して、GUIのライセンスを使用して、サーバー接続に実行し、それを維持する必要がありますする必要はいけない場合。あなたがスクリプトの中でサーバを起動するためにサブプロセスを使用する必要があると思う理由はありません。 OPとの長い会話の後

ソリューション

、それは彼が何をやってみたかったことは私の答えの最初の部分が示唆されたものだったことが判明します。彼はNukeのPythonインタプリタを使って何かをしたいスタンドアロンのスクリプトを持っています(Nuke GUIアプリケーションなしでは完全にヘッドレスです)。 Using this 3rd party module、彼は、ヌーク端末のサーバとして機能するサブプロセスでスクリプトを開始したいと考えています。彼はクライアントクラスを使用してそれと通信するコードを進めます(彼は自己がサーバープロセスをホストしていて、それと通信しています)。

解決策は、彼が直後にtime.sleep(2) 。完全にクライアントが正常に接続を許可起動するサーバーの数秒を待っ彼server.pyを開始するpopen

そして、はい、彼は今、私にビールを負っ

+0

私はあなたが何を意味しているか知っていると思う。もともと私はそのように設定した: 'np = subprocess.Popen ['X:\\アプリケーション\\ Nuke6.1v5 \\ Nuke6.1.exe'、 ' - t'、 '' 'X:\\アプリケーション\\スクリプト\ NUKE \\ nukeExternalControl \\ server.py']) ' ' np.communicate() ' これは私のために働いていません..あなたは何かを意味するのですか?あなたに私のコード例を教えてもらえますか? – user1159817

+0

まず、スクリプトをどのように設定するのか説明してください。単純にサーバーとブロックを開始するという目標はありますか? – jdi

+0

正直言って本当にわかりません。私はしばらくの間、核の中でPythonをやってきましたが、Python以外の問題はないことを知っています。私はまだかなり新しいです。限り、私は理解します。通信()ブロック..またはむしろブロックすることができます。私はあなたのスクリプトを設定することによって何を意味するのか分かりません。もしあなたがそれを始めるなら、PyGuiを起動するこのPythonスクリプトを実行する右クリックメニューのコマンドがあります。いくつかの核兵器コマンドを送ります。それは私が立ち往生した場所です。私は核兵器を使って作業するサーバーを持っています。オープンしていないだけです。 – user1159817

0

あなたが「次のコマンド/もの」と言ったときに喜んでいることが'X:\\apps\\Scripts\NUKE\\nukeExternalControl\\server.py'なら、あなたは非常に混乱しています。これはのコマンドライン引数nuke.exeに渡したものです(dir C:\を実行するとC:\と同じ方法)。

nuke.exeがPython側から何をするかを制御する方法はありません... server.pyに、exeが "起動中"であることを確認する必要があります。

+0

はい 'server.py'をnuke.exeに渡そうとしています。 Bummerしかし..私は今何をするのかに関して少し戸惑っています。nuke.exeが呼び出された後にserver.pyを渡すことはできません。サーバーを核に渡すには? – user1159817

+0

私はヌークに精通していません... –

+0

うんうん、ここには私がやろうとしていることへのリンクがあります。 https://github.com/Nvizible/NukeExternalControl私は何をしようとしていますか: "Nuke -t /nukeExternalControl/server。 py " – user1159817

関連する問題