如何使用python脚本连接node.js应用程序?

时间:2015-08-28 06:07:58

标签: javascript python node.js meteor pafy

我使用Pafy在Meteor.js和短python脚本中使用节点应用。



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脚本从node.js app获取url并将输出返回给node.js?用Python而不是Meteor.js编写所有代码会更好吗?

1 个答案:

答案 0 :(得分:1)

嗯,有很多方法可以做到这一点,这取决于你的要求。 一些选项可能是:

  1. 只需使用stdin / stdout和子进程。在这种情况下,您只需要让Python脚本从stdin读取URL,并将结果输出到stdout,然后从Node执行脚本,也许使用child_process.spawn。这是我认为最简单的方法。
  2. 将Python部分作为服务器运行,让我们说HTTP,尽管它可以是任何东西,只要您可以发送请求并获得响应。当您需要来自Node的数据时,您只需向您的Python服务器发送一个HTTP请求,它将返回您在响应中所需的数据。
  3. 在这两种情况下,您都应该以可以轻松解析的格式返回数据,否则您将不得不编写额外的(和无用的)逻辑来获取数据。使用JSON进行此类操作非常常见且非常简单。 例如,要让程序读取stdin并将JSON写入stdout,可以按以下方式更改脚本(input()用于Python 3,如果使用Python 2则使用raw_input()

    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();