2014-01-07 26 views
20

我有一個C++程序和一個Python腳本,我想將它合併到我的node.js網絡應用程序中。如何從node.js調用外部腳本/程序

我想用它們來解析上傳到我的網站的文件;它可能需要幾秒鐘的時間來處理,所以我會避免阻止應用程序。

我該如何接受該文件,然後在node.js控制器的子流程中運行C++程序和腳本?

+1

您的C++程序是從Python內部調用的還是這兩個獨立的調用? 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 shell命令始終對所有內容使用字符串,所以我認爲它是將python應用程序轉換爲數字的責任。你如何告訴python這是一個正常的命令行調用中的數字? – Plato

+1

你是對的,這很有道理。我應該考慮一下哈哈。謝謝! – Spencer