2014-01-07 9 views
20

Ich habe ein C++ Programm und ein Python Skript, das ich in meine node.js Web App integrieren möchte.So rufen Sie externe Skripte/Programme von node.js

Ich möchte sie verwenden, um die Dateien zu analysieren, die auf meine Website hochgeladen werden; Es kann ein paar Sekunden dauern, bis ich die App blockiere.

Wie kann ich nur die Datei akzeptieren dann nur das C++ Programm und Skript in einem Unterprozess von einem node.js Controller ausführen?

+1

Wird Ihr C++ - Programm von Python aus aufgerufen oder sind das zwei separate Aufrufe, die Sie ausführen werden? 1) Zu Python und 2) zu C++ App? Oder lädt Python-Code und rufen Sie Ihre C++ App auf? –

+0

Knoten 'child_process' Zeug wird Prozesse async ausführen. Wenn Sie nur ein Programm von einem Knoten aus starten wollen, ist das der Fall. – Joe

+0

@StevenLeggett Das Python-Skript und die C++ - App interagieren überhaupt nicht; Ich möchte sie beide getrennt nennen (sie müssen auch nicht in einer bestimmten Reihenfolge sein). – alh

Antwort

34

siehe child_process. Hier ist ein Beispiel mit spawn, mit dem Sie in stdin schreiben und von stderr/stdout lesen können, während Daten ausgegeben werden. Wenn Sie nicht in stdin schreiben müssen und nach Abschluss des Prozesses alle Ausgaben verarbeiten können, bietet child_process.exec eine etwas kürzere Syntax zum Ausführen eines Befehls.

// 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

Wie werden Typen mit diesem Format behandelt? Wenn ich 0,123 als Parameter sende, wie behandelt Python es, da ich denke, dass es als String eingeht? – Spencer

+1

@spencer AFAIK-URL-Komponenten, wie auch Unix-/Windows-Shell-Befehle, verwenden immer Zeichenfolgen für alles, daher halte ich es für die Aufgabe der Python-Anwendung, sie in eine Zahl umzuwandeln. Wie würdest du Python sagen, dass es eine Nummer in einem normalen Kommandozeilenaufruf ist? – Plato

+1

du hast Recht und das macht sehr viel Sinn. Ich hätte darüber noch etwas nachdenken sollen, haha. Vielen Dank! – Spencer