Интеграция Python и Node.js: вызов функций ML из Express
Быстрый ответ
Чтобы воспользоваться функцией Python в Node.js, вы можете взять помощь модуля child_process
или библиотеки python-shell
. Вот пример применения python-shell
:
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.
Взаимодействие с дочерними процессами
Если вариант с python-shell
вам не по душе, можно опробовать модуль child_process
, который входит в состав Node.js, а именно метод spawn
. Он предоставляет огромные возможности для контроля взывов функций Python и их выполнения с использованием промисов или async/await
.
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 можно описать как обмен уведомлениями:
Node.js (🎮) отправляет уведомление Python (🐍):
1. 🎮 формирует данные 📃.
2. Применяет child_process для отправки данных 📮.
3. 🐍 принимает и обрабатывает данные 📬.
4. 🐍 отправляет обратно результаты 📨.
5. 🎮 получает и обрабатывает ответ 📬.
// Node.js (🎮)
const { spawn } = require('child_process');
const pythonProcess = spawn('python', ['script.py']);
# Python (🐍)
def handle_data_from_node():
# Разбор и обработка данных
return 'Обработанные данные' # Отправка ответа обратно
if __name__ == '__main__':
print(handle_data_from_node())
Это обмен сообщениями между двуми платформами.
Плавное масштабирование и оптимизация
По мере того, как проект с момента роста, активно задумывайтесь о масштабировании: используйте балансировку нагрузки, кэширование и оптимизацию ресурсов.
Полезные материалы
- Child process | Node.js v21.6.1 Documentation
- How to call a Python function from Node.js – Stack Overflow
- GitHub – agracio/edge-js: Run .NET and Node.js code in-process on Windows, MacOS, and Linux
- RabbitMQ tutorial – Publish/Subscribe
- GitHub – microsoft/node-pty: Fork pseudoterminals in Node.JS
- python-shell – npm