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