那麼,有很多方法可以做到這一點,這取決於您的要求。 一些選項可能是:
- 只需使用stdin/stdout和一個子進程。在這種情況下,您只需讓Python腳本從stdin讀取URL,並將結果輸出到stdout,然後從Node執行腳本,也許使用child_process.spawn。這是我想最簡單的方法。
- 運行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();
它看起來像['ytdl.getInfo()'](https://github.com/fent/node-ytdl-core#ytdlgetinfourl-options-callbackerr -info)可以從純JS模塊中檢索大部分所需的信息。 – robertklep