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