如何将 node.js 应用程序与 python 脚本连接?
How to connect node.js app with python script?
我在 Meteor.js 中安装了节点应用程序,并使用 Pafy 编写了简短的 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 应用程序获取 url 并 return 返回输出到 node.js?用 Python 而不是 Meteor.js 编码会更好吗?
好吧,有很多方法可以做到这一点,这取决于您的要求。
一些选项可能是:
- 只需使用 stdin/stdout 和一个子进程。在这种情况下,你只需要让你的 Python 脚本从 stdin 读取 URL,并将结果输出到 stdout,然后从 Node 执行脚本,可能使用 child_process.spawn。这是我认为最简单的方法。
- 运行 Python 部分作为服务器,比方说 HTTP,尽管它可以是任何东西,只要您可以发送请求并获得响应。当您需要来自 Node 的数据时,您只需向您的 Python 服务器发送一个 HTTP 请求,服务器将 return 您在响应中提供您需要的数据。
在这两种情况下,您都应该 return 格式易于解析的数据,否则您将不得不编写额外的(无用的)逻辑来取回数据。使用 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();
我在 Meteor.js 中安装了节点应用程序,并使用 Pafy 编写了简短的 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 应用程序获取 url 并 return 返回输出到 node.js?用 Python 而不是 Meteor.js 编码会更好吗?
好吧,有很多方法可以做到这一点,这取决于您的要求。 一些选项可能是:
- 只需使用 stdin/stdout 和一个子进程。在这种情况下,你只需要让你的 Python 脚本从 stdin 读取 URL,并将结果输出到 stdout,然后从 Node 执行脚本,可能使用 child_process.spawn。这是我认为最简单的方法。
- 运行 Python 部分作为服务器,比方说 HTTP,尽管它可以是任何东西,只要您可以发送请求并获得响应。当您需要来自 Node 的数据时,您只需向您的 Python 服务器发送一个 HTTP 请求,服务器将 return 您在响应中提供您需要的数据。
在这两种情况下,您都应该 return 格式易于解析的数据,否则您将不得不编写额外的(无用的)逻辑来取回数据。使用 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();