2015-08-28 3 views
0

У меня есть приложение-приложение в Meteor.js и короткий скрипт python с использованием Pafy.Как подключить приложение node.js с скриптом python?

import pafy 
 

 
url = "https://www.youtube.com/watch?v=AVQpGI6Tq0o" 
 
video = pafy.new(url) 
 

 
allstreams = video.allstreams 
 
for s in allstreams: 
 
\t print(s.mediatype, s.extension, s.quality, s.get_filesize(), s.url)

Какой самый эффективный способ подключения их так питон скрипт получить URL из Node.js приложения и вернуться обратно выход на node.js? Было бы лучше закодировать все это на Python вместо Meteor.js?

+0

похоже, [ 'ytdl.getInfo()'] (https://github.com/fent/node-ytdl-core#ytdlgetinfourl-options-callbackerr -info) может извлечь большую часть необходимой информации из чистого JS-модуля. – robertklep

ответ

1

Ну, есть много способов сделать это, это зависит от ваших требований. Возможные варианты:

  1. Просто используйте stdin/stdout и дочерний процесс. В этом случае вам просто нужно, чтобы ваш скрипт Python считывал URL-адрес из stdin и выводил результат на stdout, а затем выполнял сценарий из узла, возможно, используя child_process.spawn. Это, я думаю, самый простой способ.
  2. Запустите часть Python как сервер, допустим, HTTP, хотя это может быть что угодно, если вы можете отправить запрос и получить ответ. Когда вам нужны данные из узла, вы просто отправляете HTTP-запрос на свой сервер Python, который вернет вам данные, которые вам нужны в ответе.

В обоих случаях вы должны вернуть данные в формате, который может быть легко проанализирован, иначе вам придется писать дополнительную (и бесполезную) логику только для того, чтобы вернуть данные. Использование JSON для таких вещей довольно распространено и очень легко. Например, чтобы ваши чтения программа стандартного ввода и записи в формате JSON на стандартный вывод, вы можете изменить свой сценарий следующим образом (input() для Python 3, используйте raw_input(), если вы используете Python 2)

import pafy 
import json 

url = input() 
video = pafy.new(url) 

data = [] 

allstreams = video.allstreams 
for s in allstreams: 
    data.append({ 
     'mediatype': s.mediatype, 
     'extension': s.extension, 
     'quality': s.quality, 
     'filesize': s.get_filesize(), 
     'url': s.url 
    }) 

result = json.dumps(data) 
print(result) 

Вот очень короткий пример, в NodeJS с помощью скрипта Python

var spawn = require('child_process').spawn; 

var child = spawn('python', ['my_script.py']); 

child.stdout.on('data', function (data) { 
    var parsedData = JSON.parse(data.toString()); 
    console.log(parsedData); 
}); 

child.on('close', function (code) { 
    if (code !== 0) { 
     console.log('an error has occurred'); 
    } 
}); 

child.stdin.write('https://www.youtube.com/watch?v=AVQpGI6Tq0o'); 
child.stdin.end(); 
Смежные вопросы