1

pexpectを使用してコマンドラインから(またはsubprocess.Popen()を直接使用して)サーバーアプリを起動しようとしています(erlangでは、ポートを開き、httpリクエストをリッスンします)。

アプリは正常に起動し、(pexpect を介して) 画面に正常にログを記録します。コマンド ラインからも操作できます...
問題は、サーバーが着信要求をリッスンしないことです。コマンドラインにコマンドを入力して手動で起動すると、アプリはリッスンします。サブプロセス/pexpectを使用すると、アプリが何らかの形でリッスンしなくなります...
手動で起動すると、「netstat -tlp」でアプリがリッスンしていると表示されます.python(サブプロセス/ pexpect)経由で起動すると、netstatはアプリを登録しません...

環境、Python のフォークの仕方などに関係があるような気がします。何かアイデアはありますか?

ありがとうございました

基本的な例: 注:
"-pz" - ./ebin を erl VM のモジュール パス、ライブラリ検索パスに追加するだけ
"-run" - パラメータなしで moduleName を実行します。

command_str = "erl -pz ./ebin -run moduleName"  
child = pexpect.spawn(command_str)  
child.interact() # Give control of the child to the user

これらはすべて正しく機能しますが、これは奇妙です。コード内にログを記録しており、すべてのログ メッセージが正常に出力されます。サーバーは、bashスクリプトを介してプロセスを開始してもリッスンしないため、それを引き起こしているのはpythonコードではないと思います(そのため、新しいOSプロセスの開始方法に関する何かがあると感じています)。

4

1 に答える 1

0

コマンドライン引数がサブプロセスに渡される方法に関係している可能性があります。

より具体的なコードがなければ、確かなことは言えませんが、sshsplit ( https://launchpad.net/sshsplit )でこの問題が発生しました。

引数を正しく渡すには (この例では "ssh -ND 3000")、次のようなものを使用する必要があります。

openargs = ["ssh", "-ND", "3000"]
print "Launching %s" %(" ".join(openargs))
p = subprocess.Popen(openargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

これにより、起動しているコマンドを正確に確認できるだけでなく、値を実行可能ファイルに正しく渡す必要があります。コードを見ないと断定はできませんが、これが失敗の原因である可能性が最も高いようです (プログラムが特定の作業ディレクトリまたは構成ファイルを必要とする可能性もありますか?)。

于 2010-06-01T14:42:59.310 に答える