2012-06-29 10 views
16

Niedawno miałem zamiar przetestować działanie phantomJS z Pythona jako argument wiersza poleceń, nie mam jeszcze okazji, ale widziałem przykłady. Ponieważ PhantomJS uruchamiany jest z wiersza poleceń, wydaje się to możliwe. Rezultat, który PhantomJS wypluł, zmieniłby się wprost w zmienną.Czy możliwe jest uruchomienie PhantomJS z node.js jako argument wiersza poleceń

Zanim przejdę do tej ścieżki, wykonanie tej pracy w węźle node.js przydałoby się bardziej i pomogło mi w pracy, czy mogę używać węzła do uruchamiania PhantomJS, gdy program uruchamia się z linii poleceń i magazynu dane powodują, że PhantomJS normalnie wypluwa zmienną?

Wolałbym nie używać phantomjs-node, ponieważ wydaje się używać zbyt wielu sztuczek.

Powodem tego wszystkiego jest możliwość uruchomienia PhantomJS w tym samym czasie, co inne działanie, które program wykonuje, i wykorzystanie wynikowych danych nagranych dla innych rzeczy.

Mówiąc prościej, możesz uruchomić rzeczy wiersza poleceń systemu w pythonie, czy mogę zrobić to samo w pliku node.js?

Cheers :)

Edycja: Rozumiem, że węzeł i phantom korzystać z różnych środowisk js, że jest cool, bo po prostu chcesz uruchomić fantom jako własnego procesu i złapać wszystkie dane wyjściowe do zmiennej node.js (dane będą tablicą pary, ciągu znaków i zmiennoprzecinkowej). Nie chcę "prowadzić" z fantomem, będę przygotowywać załadowane pliki javascript do tego, czego chcę. Wszystko czego chcę, to wyjście fantomowe. :)

+1

Większość ludzi wydaje się być za pomocą [ 'child_process.spawn'] (http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options) do osiągnięcia tego celu. 'child_process' jest teraz stabilnym standardowym modułem node.js, może nie było w tym czasie - node.js porusza się dość szybko. – hippietrail

Odpowiedz

14

Przypuszczam, że można wykonać prosty skrypt do uruchomienia Node.js; w tym skrypcie phantomjs skrypt zostanie uruchomiony jako proces potomny. Możesz zobaczyć działający przykład (i linki do niektórych dokumentacji) in this answer. Przypuszczam, że this discussion może być również pomocny dla ciebie.

+0

Przechodzę przez dwa linki i wygląda na to, że bezpośrednio odpowiadają na moje pytanie. Pozdrawiam :) – Joseph

+0

Dla tych, którzy są zbyt leniwi, aby kliknąć, jeden z linków wspomina o https://github.com/sgentle/phantomjs-node, który jest przedmiotem zainteresowania. – MarkHu

18

Od KMP: 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

Jako alternatywę dla odpowiedzi Donalda Dereka, można użyć funkcji spawn. Pozwoli to na odczytanie wyniku procesu potomnego zaraz po jego wygenerowaniu, a nie na wyjściu buforowanym i zwracanym do wszystkich naraz.

Możesz przeczytać więcej na ten temat here.

Przykład z 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

jak byś uciekł, powiedzmy lokalny serwer ExpressJS I odradzam podprocedurę dla fantomów, Caspera, itp.? Tak jak w przypadku, gdy przejdę do wiersza poleceń i uruchom mój plik server.js, który ma mój serwer ekspresowy i uruchamia go, a następnie w jaki sposób wywołujesz proces potomny po uruchomieniu tego początkowego serwera ekspresowego? – PositiveGuy

Powiązane problemy