2014-01-07 15 views
20

私はC++プログラムと、node.jsウェブアプリケーションに組み込みたいPythonスクリプトを持っています。node.jsから外部スクリプト/プログラムを呼び出す方法

自分のサイトにアップロードされたファイルを解析するために使用したいと思います。処理に数秒かかる場合がありますので、アプリをブロックすることは避けてください。

node.jsコントローラのサブプロセスでC++プログラムとスクリプトを実行するだけで、ファイルを受け入れることはできますか?

+1

あなたのC++プログラムはPythonから呼び出されているのですか、またはこれらの2つの別々の呼び出しを行いますか? 1)Pythonに、2)C++に? Pythonコードが読み込まれ、C++アプリケーションが呼び出されますか? –

+0

ノードの 'child_process'は、プロセスを非同期に実行します。あなたがしたいのは、ノード内からプログラムを起動するだけであれば、それができます。 – Joe

+0

@StevenLeggett PythonスクリプトとC++アプリケーションは、まったくやり取りしません。私はそれらを別々に呼びたいと思っています(どちらも特定の順序になる必要はありません)。 – alh

答えて

34

child_processを参照のこと。 spawnを使用した例を示します。この例では、stdinに書き込んだり、stderr/stdoutからデータを出力したりすることができます。 stdinに書き込む必要がなく、プロセスが完了したときにすべての出力を処理できる場合は、child_process.execはコマンドを実行するために少し短い構文を提供します。

// with express 3.x 
var express = require('express'); 
var app = express(); 
app.use(express.logger('dev')); 
app.use(express.bodyParser()); 
app.use(app.router); 
app.post('/upload', function(req, res){ 
    if(req.files.myUpload){ 
    var python = require('child_process').spawn(
    'python', 
    // second argument is array of parameters, e.g.: 
    ["/home/me/pythonScript.py" 
    , req.files.myUpload.path 
    , req.files.myUpload.type] 
    ); 
    var output = ""; 
    python.stdout.on('data', function(data){ output += data }); 
    python.on('close', function(code){ 
     if (code !== 0) { 
      return res.send(500, code); 
     } 
     return res.send(200, output); 
    }); 
    } else { res.send(500, 'No file found') } 
}); 

require('http').createServer(app).listen(3000, function(){ 
    console.log('Listening on 3000'); 
}); 
+0

この形式ではどのように型を扱いますか?パラメータとして0.123を送ると、それは文字列として来ていると思いますので、Pythonはどのように扱いますか? – Spencer

+1

@spencer AFAIK URLコンポーネント、およびunix/windowsシェルコマンドは、常にすべての文字列を使用するので、数値にキャストするというPythonアプリケーションの責任と考えています。あなたはPythonに普通のコマンドライン呼び出しでどのような数字を教えていますか? – Plato

+1

あなたは正しいですし、それは多くの意味があります。私はそれについてもう少し考えていたはずです。ありがとう! – Spencer

関連する問題