使用子进程spawn()方法从Node.js运行Python脚本?

NodeJ和Python是开发人员和Web设计人员中的两种主要首选语言。但是在数值和科学计算(AI,机器学习,深度学习等)方面,NodeJ缺少Python的几个领域。python提供了许多库,可以更轻松地与科学计算一起使用。

幸运的是,我们可以在后台运行python并返回结果,从而在nodejs应用程序中利用python库。

为此,我们将使用NodeJs的child_process标准库在后台生成pyton进程,进行计算并将结果返回给我们的节点程序。

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()method创建一个子进程。

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()//打印脚本的输出

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

以上是 使用子进程spawn()方法从Node.js运行Python脚本? 的全部内容, 来源链接: utcz.com/z/316201.html

回到顶部