اذهب إلى المحتوى

السؤال

نشر

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

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

Recommended Posts

  • 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()

 

  • 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);
});

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...