Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

เรียกใช้สคริปต์ Python จาก Node.js โดยใช้วิธี spawn() กระบวนการลูกหรือไม่


NodeJs และ Python เป็นสองภาษาหลักที่นิยมใช้ในหมู่นักพัฒนาและนักออกแบบเว็บไซต์ แต่มีสองส่วนที่ NodeJs ขาด python คือการคำนวณเชิงตัวเลขและวิทยาศาสตร์ (AI, แมชชีนเลิร์นนิง, การเรียนรู้เชิงลึก ฯลฯ) ในขณะที่ python มีไลบรารีจำนวนมากเพื่อทำงานกับการคำนวณทางวิทยาศาสตร์ได้ง่ายขึ้นมาก

โชคดีที่เราสามารถใช้ไลบรารี python ภายในแอปพลิเคชัน nodejs ของเราได้โดยการเรียกใช้ python ในพื้นหลังและส่งคืนผลลัพธ์

สำหรับสิ่งนี้ เราจะใช้ไลบรารีมาตรฐาน child_process ของ NodeJs เพื่อวางไข่กระบวนการ pyton ในพื้นหลัง ทำการคำนวณและส่งคืนผลลัพธ์ไปยังโปรแกรมโหนดของเรา

สคริปต์หลาม

เราจะเขียนสคริปต์ 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 event เราจะไม่ได้รับคำสั่ง 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