Computer >> Máy Tính >  >> Lập trình >> Python

Chạy tập lệnh Python từ Node.js bằng phương thức child process spawn ()?

NodeJs và Python là hai ngôn ngữ được ưa thích chính giữa các nhà phát triển và nhà thiết kế web. Nhưng có một số lĩnh vực mà NodeJ không thể so sánh được với python là tính toán số và khoa học (AI, Máy học, học sâu, v.v.). Trong khi đó, python cung cấp rất nhiều thư viện để làm việc với máy tính khoa học dễ dàng hơn rất nhiều.

May mắn thay, chúng tôi có thể sử dụng các thư viện python trong ứng dụng nodejs của mình bằng cách chạy python trong nền và trả về kết quả.

Đối với điều này, chúng tôi sẽ sử dụng thư viện tiêu chuẩn child_process của NodeJs để tạo ra một quy trình pyton trong nền, thực hiện tính toán và trả lại kết quả cho chương trình nút của chúng tôi.

Tập lệnh Python

Chúng tôi sẽ viết một tập lệnh python đơn giản để xuất thông báo ra đầu ra chuẩn.

 #Import libraryimport sys, getopt, timedef main (argv):reason ='' using ='using:myscript.py -f ' # phân tích cú pháp các đối số đến, hãy thử:opts, args =getopt.getopt (argv, "hf:", ["foo ="]) ngoại trừ getopt.GetoptError:print (using) sys.exit (2) for opt, arg in opts:if opt =='-h':print (using) sys.exit () elif opt in ("-f", "--foo"):đối số =arg # print output print ("Start:% s"% time.ctime ()) time.sleep (2) print ('Foo là ') time.sleep (2) print (đối số) print ("End:% s"% time.ctime ()) if __name__ =="__main __":main (sys.argv [1:]) 

Đầu ra

> python myscript.py -f "Xin chào, Python" Bắt đầu:Thứ tư ngày 20 tháng 2 07:52:45 năm 2019 Thật tuyệt vời, xin chào! 

Sẽ tạo ra kết quả tương tự như trên, nếu chúng tôi cố gắng chạy với đối số:

> python myscript.py --foo "Xin chào, Python"> python myscript.py –h 

Đầu ra

 cách sử dụng:myscript.py -f  

Tương tác NodeJs

Tập lệnh nodejs của chúng tôi sẽ tương tác với tập lệnh python bằng cách đầu tiên gọi tập lệnh python sau đó chuyển đầu ra tập lệnh cho ứng dụng khách và hiển thị đầu ra trong ứng dụng khách.

Vì vậy, hãy tạo một tập lệnh nodejs, trong đó chúng tôi sẽ cố gắng tạo một quy trình con bằng cách sử dụng phương thức spawn ().

server.js

 const path =request ('path') const {spawn} =request ('child_process') / ** * Chạy python myscript, truyền vào `-u` để không đệm đầu ra của bảng điều khiển * @return {ChildProcess} * / function runScript () {return spawn ('python', ["-u", path.join (__ dirname, 'myscript.py'), "--foo", "some value for foo",]);} const subprocess =runScript () // in đầu ra của scriptsubprocess.stdout.on ('data', (data) => {console.log (`data:$ {data}`);}); subprocess.stderr.on ('data ', (data) => {console.log (`error:$ {data}`);}); subprocess.stderr.on (' close ', () => {console.log ("Đã đóng");} ); 

Tập lệnh trên sẽ đưa ra đầu ra thông qua .on (‘data’, callback). Để ngăn python lưu vào bộ đệm đầu ra, hãy sử dụng cờ –f, nếu không sự kiện dữ liệu, chúng tôi sẽ không nhận được câu lệnh print () từ chương trình cho đến khi kết thúc quá trình thực thi.

> node server.jsdata:Bắt đầu:Thứ tư ngày 20 tháng 2 10:56:11 năm 2019 dữ liệu:Foo isdata:một số giá trị cho dữ liệu thực phẩm:Kết thúc:Thứ tư ngày 20 tháng 2 10:56:15 năm 2019 Đóng cửa