Как связать приложение 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 ответа

Решение

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

  1. Просто используйте stdin/stdout и дочерний процесс. В этом случае вам просто нужно получить скрипт Python для чтения URL-адреса из stdin и вывести результат в stdout, а затем выполнить скрипт из Node, возможно, используя child_process.spawn. Это я считаю самым простым способом.
  2. Запустите часть 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']);
Другие вопросы по тегам