কম্পিউটার টিউটোরিয়াল

Node.js-এ child_process spawn() মেথড দিয়ে পাইথন স্ক্রিপ্ট চালান

Node.js এবং পাইথন—ডেভেলপার ও ওয়েব ডিজাইনারদের পছন্দের দুটি প্রধান ভাষা। কিন্তু কিছু ক্ষেত্রে Node.js পাইথনের থেকে পিছিয়া পড়ে, যেমন সংখ্যালগণিত ও বৈজ্ঞানিক কম্পিউটেশন (AI, মেশিন লার্নিং, ডিপ লার্নিং ইত্যাদি)। অন্যদিকে পাইথনে বৈজ্ঞানিক কম্পিউটেশনের জন্য অনেক লাইব্রেরি আছে।

সৌভাগ্যক্রমে, Node.js অ্যাপ্লিকেশনের ভিতরে পাইথন লাইব্রেরি ব্যবহার করা যায়—পাইথন প’arrière-প্ল্যানে চালিয়ে ফলাফল নোড প্রোগ্রামে ফেরত পাঠানো।

এজন্য Node.js-এর child_process স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে পাইথন প্রসেস স্পন (spawn) করব, কম্পিউটেশন করব এবং ফলাফল নোড প্রোগ্রামে ফেরত পাব।

পাইথন স্ক্রিপ্ট

একটি সাধারণ পাইথন স্ক্রিপ্ট লিখব যা স্ট্যান্ডার্ড আউটপুটে মেসেজ প্রিন্ট করবে।

# লাইব্রেরি ইম্পোর্ট
import sys, getopt, time

def main(argv):
    argument = ''
    usage = 'usage: myscript.py -f '
    
    # ইনকামিং আর্গুমেন্ট পার্স করুন
    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("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

--foo আর্গুমেন্ট দিয়েও একই আউটপুট পাওয়া যাবে:

>python myscript.py --foo "Hello, Python"
>python myscript.py --h

আউটপুট

usage: myscript.py -f 

Node.js ইন্টারঅ্যাকশন

আমাদের Node.js স্ক্রিপ্ট পাইথন স্ক্রিপ্টকে কল করবে, তার আউটপুট ক্লায়েন্টে পাস করবে এবং ক্লায়েন্টে রেন্ডার করবে।

আসুন একটি Node.js স্ক্রিপ্ট তৈরি করি যেখানে spawn() মেথড দিয়ে চাইল্ড প্রসেস তৈরি করব।

server.js

const path = require('path')
const {spawn} = require('child_process')

/**
 * পাইথন myscript চালান, `-u` দিয়ে কনসোল আউটপুট বাফার না করা
 * @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) দিয়ে আউটপুট দেবে। পাইথন আউটপুট বাফার না করবে তা নিশ্চিত করতে -u ফ্ল্যাগ ব্যবহার করুন, অন্যথায় প্রোগ্রাম শেষ হওয়া পর্যন্ত 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
  1. পাইথনে বাইনারি ট্রি থেকে স্ট্রিং কনস্ট্রাক্ট (Construct String from Binary Tree)

  2. পাইথনে লিফ থেকে ছোট স্ট্রিং বের করা

  3. পাইথনে POST মেথড ব্যবহার করে তথ্য পাস করা

  4. পাইথনে GET মেথড ব্যবহার করে তথ্য পাস করা