Вопрос или проблема
Итак, у меня есть 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.
Рассмотрим подробнее вашу ситуацию и возможные шаги для ее решения:
Факторы проблемы:
-
Среда выполнения: PHP запускает Python-скрипт, что может создать проблемы с окружением для Python. Зачастую PHP не наследует переменные среды, такие как
PYTHONPATH
, которые могут быть необходимы для корректной работы Python. -
Проблемы с импортом: Из вашего описания видно, что проблемы возникают при импорте конкретных библиотек, таких как
numpy.array
иjoblib
. Эти модули могут требовать специфических настроек среды, которые не передаются через PHP. -
Версии библиотек: Если библиотеки (например,
numpy
илиjoblib
) не установлены в системной версии Python, которую PHP вызывает, это также может привести к ошибкам.
Шаги для решения:
-
Указание PYTHONPATH:
Убедитесь, что все зависимости Python корректно установлены и доступны в той среде, из которой вы запускаете скрипт. Возможное решение, которое вы уже нашли, — использованиеputenv
для выставленияPYTHONPATH
. Это заставит PHP использовать специфическое окружение Python, в котором эти зависимости установлены:putenv('PYTHONPATH=C:\xampp\htdocs\mil\mypython\venv\Lib\site-packages');
Это гарантирует, что ваши библиотеки будут найдены интерпретатором Python.
-
Проверка путей и прав:
Убедитесь, что у PHP есть все необходимые права доступа для выполнения файлов Python, особенно если они расположены в защищенных системных директориях. -
Логирование ошибок:
Используйте механизм логирования, чтобы отловить любые ошибки, которые скрипт может выбросить. Например, направляйте stderr в отдельный файл для дальнейшего анализа:$descriptorspec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("file", "error-output.txt", "a") );
-
Диагностика и тесты:
Попробуйте выполнить скрипт отдельно от PHP в командной строке с теми же параметрами, чтобы убедиться, что он работает корректно. Также стоит проверить, какая версия Python вызывается внутри PHP. -
Изоляция проблемы:
Убедитесь, что проблема не связана с временными ограничениями или ограничениями ресурсов, добавляемыми веб-середой или PHP-интерпретатором.
Следуя этим рекомендациям, вы сможете эффективно выявить и устранить проблему. Надеюсь, эти советы помогут вам успешно реализовать интеграцию Python-скриптов с вашим WordPress API.