• 0

استدعاء توابع بايثون من خلال node.js

لدي مشروع مبني باستخدام إطار العمل express في node.js ولدي أيضاً خوارزمية معيّنة ضمن بايثون أرغب باستخدامها على البيانات التي يتم الحصول عليها من خلال كود node.js

هل هنالك طريقة لاستدعاء بعض التوابع من كود بايثون إلى node.js؟ وكيف سيتم تمرير المعطيات والنتائج بينهما؟

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

من أسهل الطرق هو استخدام child_process في node.js ثم يمكنك الوصول إلى مسار الكود في بايثون مع إمكانية تمرير المتغيرات بشكل مصفوفة بالشكل التالي:

const spawn = require("child_process").spawn;

const pythonCode = spawn('python',["..../pathhere/script.py", args1, args2, ...]);

ثم يجب التأكد من تضمين أو (import sys) ضمن كود بايثون لديك وعندها ستتمكن من الوصول إلى قيم المتغيرات التي تم تمريرها من node.js بالشكل التالي: sys.argv[1] ....إلخ.

أما لإرسال البيانات مجدداً من بايثون إلى node.js يمكنك إضافة التالي إلى الكود في بايثون:

print(dataToSendBack)

sys.stdout.flush()

ثم يمكن لطرف node.js استقبال البيانات بالشكل التالي:

pythonCode.stdout.on('data', (data) => {
    ....
});

كما يمكنك استخدام الحزمة python-shell ويتم تحميلها بالشكل التالي:

npm install python-shell

ثم يتم استدعاء ملفات بايثون:

const PythonShell = require('python-shell').PythonShell;

PythonShell.run('script.py', null, function (err) {
  if (err) throw err;
  console.log('done');
});

ويتم تمرير المتغيرات من خلالها بهذا الشكل:

var options = {
  mode: 'text',
  pythonPath: 'path/here/',
  pythonOptions: ['-u'],
  scriptPath: 'path/to/script',
  args: ['v1', 'v2', 'v3']
};

PythonShell.run('script.py', options, function (err, result) {
  if (err) 

    throw err;

  console.log('test results: %j', result);
});

كما يوجد بعض الحزم المشتركة مثل حزمة zerorpc التي يمكنك تضمينها في كل من كود الجافاسكريبت في node.js وكود بايثون واستخدامها في كلا الطرفين على منفذ واحد مما قد يسهّل آلية العمل خصوصاً في حال تبادل البيانات بشكل مكرر بين كل من الطرفين، بالشكل التالي:

ضمن كود الجافاسكريبت:

//في طرف node.js

var zerorpc = require("zerorpc");

var client = new zerorpc.Client();

client.connect("tcp://127.0.0.1:3000");

client.invoke("hello world", "RPC", function(error, res, more) {
    console.log(res);
});

ضمن بايثون:

import zerorpc

class HelloRPC(object):
    def hello(self, name):
        return "Hello there: , %s" % name

t = zerorpc.Server(HelloRPC())
t.bind("tcp://0.0.0.0:3000")
t.run()

 

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

وحدة  python-shell من extrabacon هي وسيلة بسيطة لتشغيل أكواد بايثون من Node.js مع تواصل عملية داخلية أساسية ولكن فعالة ومعالجة الأخطاء بشكل أفضل.

التثبيت:

بإستخدام npm: 

npm install python-shell

أو ب yarn

yarn add python-shell

تشغيل كود بايثون بسيط

const PythonShell = require('python-shell').PythonShell;

PythonShell.run('my_script.py', null, function (err) {
  if (err) throw err;
  console.log('finished');
});

تشغيل نص Python بالمُدخلات والخيارات:

const PythonShell = require('python-shell').PythonShell;

var options = {
  mode: 'text',
  pythonPath: 'path/to/python',
  pythonOptions: ['-u'],
  scriptPath: 'path/to/my/scripts',
  args: ['value1', 'value2', 'value3']
};

PythonShell.run('my_script.py', options, function (err, results) {
  if (err) 
    throw err;
  /* المتغير
   * results
   * هو عبارة عن مصفوفة تحتوي الرسائل التي تم تجميعها من التنفيذ
  */ 
  console.log('results: %j', results);
});

للحصول على مزيد من المعلومات وكود المصدر ، تحقق من التوثيق الرسمي

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن