2012-06-29 4 views
16

Ich habe kürzlich versucht, phantomJS von Python als Kommandozeilenargument zu testen, ich bin noch nicht dazu gekommen, habe aber Beispiele gesehen. Da PhantomJS über die Befehlszeile ausgeführt wird, scheint dies möglich zu sein. Das Ergebnis, dass PhantomJS ausspucken würde, würde direkt in eine Variable gehen.Ist es möglich, PhantomJS von node.js als Kommandozeilenargument auszuführen

Bevor ich diesen Pfad nutze, wäre die Arbeit in node.js für mich nützlicher und es hat mich zum Nachdenken gebracht, kann ich einfach den Knoten verwenden, um PhantomJS auszuführen, während ein Programm von der Befehlszeile ausgeführt und gespeichert wird die Daten, die PhantomJS normalerweise in eine Variable ausgeben würde?

Ich würde lieber nicht phantomjs-node verwenden, weil es scheint, zu viele Tricks zu verwenden.

Der Grund für all dies ist in der Lage zu sein, PhantomJS gleichzeitig mit einer anderen Aktion auszuführen, die das Programm ausführt, und die daraus resultierenden Daten für andere Zwecke zu verwenden.

Einfach gesagt, können Sie System-Befehlszeilen-Sachen in Python ausführen, kann ich das gleiche in node.js tun?

Prost :)

Edit: Ich verstehe, dass der Knoten und Phantom Umgebungen unterschiedliche js verwenden, das ist cool, weil ich will nur Phantom als eigener Prozess ausgeführt und alle, dass Ausgangsdaten in eine node.js Variable fangen (Die Daten werden ein Array aus einem Paar, String und Gleitkomma sein.) Ich möchte nicht mit Phantom "fahren", ich werde die geladenen Javascript-Dateien erstellen, was ich will. Alles, was ich will, ist Phantom-Ausgang. :)

+1

Die meisten Menschen scheinen zu sein mit [ 'child_process.spawn'] (http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options) dies zu erreichen. 'child_process' ist jetzt ein stabiles Standard-Modul von node.js, vielleicht war es nicht zu der Zeit, als Sie gefragt wurden - node.js bewegt sich ziemlich schnell. – hippietrail

Antwort

14

Ich nehme an, Sie können ein einfaches Skript für Node.js ausführen lassen; In diesem Skript wird das Skript phantomjs als untergeordneter Prozess ausgeführt. Sie können das Arbeitsbeispiel (und Links für einige Dokumentation) in this answer sehen. Ich nehme an, this discussion könnte auch für Sie hilfreich sein.

+0

Ich gehe über die zwei Links und es sieht so aus, als ob sie meine Frage direkt ansprechen. Prost :) – Joseph

+0

Für diejenigen, die zu faul sind, um durchzuklicken, erwähnt einer der Links https://github.com/sgentle/phantomjs-node, was von Interesse ist. – MarkHu

18

Von NPM: https://npmjs.org/package/phantomjs

var path = require('path') 
var childProcess = require('child_process') 
var phantomjs = require('phantomjs') 
var binPath = phantomjs.path 

var childArgs = [ 
    path.join(__dirname, 'phantomjs-script.js'), 
    'some other argument (passed to phantomjs script)' 
] 

childProcess.execFile(binPath, childArgs, function(err, stdout, stderr) { 
    // handle results 
}) 
5

Als Alternative zu Donald Dereks Antwort, können Sie die spawn-Funktion verwenden. Es ermöglicht Ihnen, die Ausgabe des untergeordneten Prozesses zu lesen, sobald sie erstellt wird, anstatt dass die Ausgabe gepuffert und an alle gleichzeitig zurückgegeben wird.

Sie können mehr darüber lesen here.

Ein Beispiel aus the documentation.

var spawn = require('child_process').spawn, 
    ls = spawn('ls', ['-lh', '/usr']); 

ls.stdout.on('data', function (data) { 
    console.log('stdout: ' + data); 
}); 

ls.stderr.on('data', function (data) { 
    console.log('stderr: ' + data); 
}); 

ls.on('close', function (code) { 
    console.log('child process exited with code ' + code); 
}); 
+1

Wie würdest du laufen lassen, sagen wir einen lokalen ExpressJS-Server UND spawn einen Unterprozess für Phantom, Casper, etc.? Wie wenn ich zur Eingabeaufforderung gehe und meine server.js ausführe, die meinen Express-Server hat und sie startet, wie rufe ich dann den Launch des Kind-Prozesses auf, nachdem du diesen ersten Express-Server gestartet hast? – PositiveGuy