Вызов Python-скрипта из пользовательского REST API WordPress возвращает null.

Вопрос или проблема

Итак, у меня есть python-скрипт, который использует модели машинного обучения для предсказания и вывода строки. Запуск скрипта в одиночку дает желаемый результат и занимает около 12 секунд. Однако вызов этого скрипта через созданную конечную точку REST API в WordPress возвращает null. Я попробовал выполнить стандартный скрипт “Hello, World” на python, и он работает нормально. После множества экспериментов и вариаций я обнаружил, что проблема связана с импортированием библиотек. Точнее, импортирование numpy.array и/или joblib из sklearn.externals каким-то образом вызывает нулевой вывод. Вот python-код:

#!C:\xampp\htdocs\mil\Scripts\python.exe

from datetime import datetime 
import json
from numpy import array
from sklearn.externals import joblib
import traceback

print("hello")

А вот php-код, который я использую внутри функции получения custom rest API:

$topy = 'python C:\xampp\htdocs\mil\mypython\venv\test.py';
$command = escapeshellcmd($topy);
$output = shell_exec($command);
return $output;

Я также попробовал два следующих варианта, но проблема сохраняется, я получаю пустую строку в качестве вывода.
1.

ob_start();
passthru('python C:\Users\Deepon\PycharmProjects\Home\test.py');
$output = ob_get_clean(); 
return $output;

2.

$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w"),
   2 => array("file", "error-output.txt", "a")
);

$process = proc_open('python C:\xampp\htdocs\mil\mypython\venv\test.py', $descriptorspec, $pipes);

if (is_resource($process)) {

print fgets($pipes[1]);
$return_value = proc_close($process);

return $return_value;
}

Так что, ребята, есть идеи, как решить эту дилемму?

Спасибо @JacobPeattie. Теперь я понимаю, после того как прочитал несколько статей, что проблема была действительно не в wordpress, а в php, и я смотрел не в том направлении. Решение, которое я нашел, я запишу здесь на всякий случай:

putenv('PYTHONPATH=C:\xampp\htdocs\mil\mypython\venv\Lib\site-packages');

Действительно, проблема была в php. Я нашел ответ только после исключения wordpress из поискового запроса.

Ответ или решение

Проблема, описанная в вашем вопросе, связана с использованием Python скрипта внутри PHP-среды, в частности, при вызове этого скрипта через пользовательский REST API в WordPress. В результате выполнения такого запроса вы получаете null. Исходя из вашего описания, очевидно, что скрипт Python имеет зависимости, которые, вероятно, вызываются некорректно из PHP.

Рассмотрим подробнее вашу ситуацию и возможные шаги для ее решения:

Факторы проблемы:

  1. Среда выполнения: PHP запускает Python-скрипт, что может создать проблемы с окружением для Python. Зачастую PHP не наследует переменные среды, такие как PYTHONPATH, которые могут быть необходимы для корректной работы Python.

  2. Проблемы с импортом: Из вашего описания видно, что проблемы возникают при импорте конкретных библиотек, таких как numpy.array и joblib. Эти модули могут требовать специфических настроек среды, которые не передаются через PHP.

  3. Версии библиотек: Если библиотеки (например, numpy или joblib) не установлены в системной версии Python, которую PHP вызывает, это также может привести к ошибкам.

Шаги для решения:

  1. Указание PYTHONPATH:
    Убедитесь, что все зависимости Python корректно установлены и доступны в той среде, из которой вы запускаете скрипт. Возможное решение, которое вы уже нашли, — использование putenv для выставления PYTHONPATH. Это заставит PHP использовать специфическое окружение Python, в котором эти зависимости установлены:

    putenv('PYTHONPATH=C:\xampp\htdocs\mil\mypython\venv\Lib\site-packages');

    Это гарантирует, что ваши библиотеки будут найдены интерпретатором Python.

  2. Проверка путей и прав:
    Убедитесь, что у PHP есть все необходимые права доступа для выполнения файлов Python, особенно если они расположены в защищенных системных директориях.

  3. Логирование ошибок:
    Используйте механизм логирования, чтобы отловить любые ошибки, которые скрипт может выбросить. Например, направляйте stderr в отдельный файл для дальнейшего анализа:

    $descriptorspec = array(
       0 => array("pipe", "r"),
       1 => array("pipe", "w"),
       2 => array("file", "error-output.txt", "a")
    );
  4. Диагностика и тесты:
    Попробуйте выполнить скрипт отдельно от PHP в командной строке с теми же параметрами, чтобы убедиться, что он работает корректно. Также стоит проверить, какая версия Python вызывается внутри PHP.

  5. Изоляция проблемы:
    Убедитесь, что проблема не связана с временными ограничениями или ограничениями ресурсов, добавляемыми веб-середой или PHP-интерпретатором.

Следуя этим рекомендациям, вы сможете эффективно выявить и устранить проблему. Надеюсь, эти советы помогут вам успешно реализовать интеграцию Python-скриптов с вашим WordPress API.

Оцените материал
Добавить комментарий

Капча загружается...