Как связать приложение node.js со скриптом Python?
У меня есть нодное приложение в Meteor.js и короткий скрипт на Python с использованием Pafy.
import pafy
url = "https://www.youtube.com/watch?v=AVQpGI6Tq0o"
video = pafy.new(url)
allstreams = video.allstreams
for s in allstreams:
print(s.mediatype, s.extension, s.quality, s.get_filesize(), s.url)
Какой самый эффективный способ соединить их, чтобы скрипт Python получал URL из приложения node.js и возвращал выходные данные в node.js? Было бы лучше кодировать все это на Python вместо Meteor.js?
2 ответа
Ну, есть много способов сделать это, это зависит от ваших требований. Некоторые варианты могут быть:
- Просто используйте stdin/stdout и дочерний процесс. В этом случае вам просто нужно получить скрипт Python для чтения URL-адреса из stdin и вывести результат в stdout, а затем выполнить скрипт из Node, возможно, используя child_process.spawn. Это я считаю самым простым способом.
- Запустите часть Python как сервер, скажем, HTTP, хотя это может быть что угодно, если вы можете отправить запрос и получить ответ. Когда вам нужны данные от Node, вы просто отправляете HTTP-запрос на ваш сервер Python, который вернет вам данные, которые вам нужны в ответе.
В обоих случаях вы должны возвращать данные в формате, который можно легко проанализировать, в противном случае вам придется написать дополнительную (и бесполезную) логику, чтобы вернуть данные. Использование JSON для таких вещей довольно распространено и очень просто. Например, чтобы ваша программа читала stdin и записывала JSON в stdout, вы можете изменить свой скрипт следующим образом (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();
Если вы создадите окно, вы будете использовать этот фрагмент для бокового окна.
var child = spawn('python', ['my_script.py']);