Интеграция Python и Node.js: вызов функций ML из Express

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы воспользоваться функцией Python в Node.js, вы можете взять помощь модуля child_process или библиотеки python-shell. Вот пример применения python-shell:

JS
Скопировать код
const { PythonShell } = require('python-shell');

PythonShell.run('script.py', null, (err, results) => {
  if (err) throw err;
  console.log(results);
});

Убедитесь, что файл script.py находится в каталоге вашего Node.js проекта, и что Python добавлен в системную переменную PATH. Приведенный код иллюстрирует взаимосвязь между Node.js и Python.

Кинга Идем в IT: пошаговый план для смены профессии

Взаимодействие с дочерними процессами

Если вариант с python-shell вам не по душе, можно опробовать модуль child_process, который входит в состав Node.js, а именно метод spawn. Он предоставляет огромные возможности для контроля взывов функций Python и их выполнения с использованием промисов или async/await.

JS
Скопировать код
const { spawn } = require('child_process');

function runPythonScript(args) {
  return new Promise((resolve, reject) => {
    const pythonProcess = spawn('python', ['script.py', ...args]);

    let output = '';
    pythonProcess.stdout.on('data', (data) => {
      output += data.toString();
    });

    pythonProcess.on('close', (code) => {
      if (code !== 0) {
        return reject(new Error(`Python скрипт завершился с кодом ${code}`));
      }
      resolve(output);
    });

    pythonProcess.stderr.on('data', (data) => {
      reject(new Error(data));
    });
  });
}

async function main() {
  try {
    const result = await runPythonScript(['arg1', 'arg2']);
    console.log(result);
  } catch (err) {
    console.error('Ошибка при выполнении Python скрипта:', err);
  }
}

main();

Данный пример показывает, как запускать скрипты Python, обрабатывать их вывод и обрабатывать ошибки.

Создание двусторонней связи

Применительно к более сложным сценариям взаимодействия можно использовать библиотеки zerorpc или JSPyBridge. Они предоставляют возможности для взаимного вызова методов Node.js и Python.

  • zerorpc упрощает RPC-коммуникацию между Node.js и Python.

  • JSPyBridge позволяет прямо вызывать функции Python с использованием свойств ES6 и top-level await.

Не забудьте корректно завершать Python-процессы через python.exit(), чтобы не потерять ресурсы.

Подготовка к работе в продакшене

  • Обработка ошибок: необходимо гарантировать надежную обработку ошибок для предотвращения возникновения проблем при исполнении Python скриптов.

  • Безопасность: всегда старайтесь очищать входные данные перед передачей в Python-скрипты.

  • Производительность: избегайте нагрузки системы путем длительного вызова скриптов. Обращайтесь к инструментам, таким как RabbitMQ, для оптимизации сообщений между процессами.

  • Синхронизация данных: правильно управляйте асинхронными операциями, чтобы избежать проблем с целостностью данных.

Визуализация

Взаимодействие Node.js и Python можно описать как обмен уведомлениями:

Markdown
Скопировать код
Node.js (🎮) отправляет уведомление Python (🐍):

1. 🎮 формирует данные 📃.
2. Применяет child_process для отправки данных 📮.
3. 🐍 принимает и обрабатывает данные 📬.
4. 🐍 отправляет обратно результаты 📨.
5. 🎮 получает и обрабатывает ответ 📬.
JS
Скопировать код
// Node.js (🎮)
const { spawn } = require('child_process');
const pythonProcess = spawn('python', ['script.py']);
Python
Скопировать код
# Python (🐍)
def handle_data_from_node():
    # Разбор и обработка данных
    return 'Обработанные данные'  # Отправка ответа обратно

if __name__ == '__main__':
    print(handle_data_from_node())

Это обмен сообщениями между двуми платформами.

Плавное масштабирование и оптимизация

По мере того, как проект с момента роста, активно задумывайтесь о масштабировании: используйте балансировку нагрузки, кэширование и оптимизацию ресурсов.

Полезные материалы

  1. Child process | Node.js v21.6.1 Documentation
  2. How to call a Python function from Node.js – Stack Overflow
  3. GitHub – agracio/edge-js: Run .NET and Node.js code in-process on Windows, MacOS, and Linux
  4. RabbitMQ tutorial – Publish/Subscribe
  5. GitHub – microsoft/node-pty: Fork pseudoterminals in Node.JS
  6. python-shell – npm