2015-08-28 76 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(); 
相關問題