2015-08-28 55 views
0

我已经在Meteor.js节点应用程序和使用Pafy短python脚本。如何使用python脚本连接node.js应用程序?

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)

什么好python脚本从node.js的应用程序获得URL,并返回输出到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脚本从stdin读取URL,并将结果输出到stdout,然后从Node执行脚本,也许使用child_process.spawn。这是我想最简单的方法。
  2. 运行Python部分作为服务器,让我们说HTTP,尽管它可以是任何东西,只要您可以发送请求并获得响应。当你需要来自Node的数据时,你只需要向你的Python服务器发送一个HTTP请求,它将返回你在响应中需要的数据。

在这两种情况下,您都应该使用可轻松解析的格式返回数据,否则您将不得不编写额外的(无用的)逻辑来恢复数据。使用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) 

这里在使用Python脚本的NodeJS非常短的示例

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(); 
相关问题