如何使用 child process spawn() 方法从 Node.js 运行 Python 脚本?
NodeJs 和 Python 是开发者和网页设计师最喜欢的两种主要语言。但是,在一些领域 NodeJs 不如 Python,例如数值和科学计算(AI、机器学习、深度学习等)。而 Python 提供了许多库,可以更轻松地进行科学计算。
幸运的是,我们可以通过在后台运行 Python 并返回结果,在 Nodejs 应用程序中利用 Python 库。
为此,我们将使用 NodeJs 的 child_process 标准库在后台生成一个 Python 进程,进行计算并将结果返回到我们的 Node 程序。
Python 脚本
我们将编写一个简单的 Python 脚本,它会在执行过程中将消息输出到标准输出。
#Import library
import sys, getopt, time
def main(argv):
argument = ''
usage = 'usage: myscript.py -f <sometext>'
# parse incoming arguments
try:
opts, args = getopt.getopt(argv,"hf:",["foo="])
except getopt.GetoptError:
print(usage)
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print(usage)
sys.exit()
elif opt in ("-f", "--foo"):
argument = arg
# print output
print("Start : %s" % time.ctime())
time.sleep( 2 )
print('Foo is')
time.sleep( 2 )
print(argument)
print("End : %s" % time.ctime())
if __name__ == "__main__":
main(sys.argv[1:])输出
>python myscript.py -f "Hello, Python" Start : Wed Feb 20 07:52:45 2019 Foo is Hello, Python End : Wed Feb 20 07:52:49 2019
如果我们尝试使用参数运行,将会生成与上面相同的输出。
>python myscript.py --foo "Hello, Python" >python myscript.py –h
输出
usage: myscript.py -f <Hello, Python>
NodeJs 交互
我们的 Nodejs 脚本将首先调用 Python 脚本,然后将脚本输出传递给客户端并在客户端呈现输出,从而与 Python 脚本进行交互。
因此,让我们创建一个 Nodejs 脚本,在其中我们将尝试使用 spawn() 方法创建一个子进程。
server.js
const path = require('path')
const {spawn} = require('child_process')
/**
* Run python myscript, pass in `-u` to not buffer console output
* @return {ChildProcess}
*/
function runScript(){
return spawn('python', [
"-u",
path.join(__dirname, 'myscript.py'),
"--foo", "some value for foo",
]);
}
const subprocess = runScript()
// print output of script
subprocess.stdout.on('data', (data) => {
console.log(`data:${data}`);
});
subprocess.stderr.on('data', (data) => {
console.log(`error:${data}`);
});
subprocess.stderr.on('close', () => {
console.log("Closed");
});上述脚本将通过 .on('data', callback) 输出结果。为了防止 Python 缓冲输出,请使用 -f 标志,否则 data 事件将不会打印程序的 print() 语句,直到执行结束。
>node server.js data:Start : Wed Feb 20 10:56:11 2019 data:Foo is data:some value for foo data:End : Wed Feb 20 10:56:15 2019 Closed
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP