Вопрос или проблема
Я пытаюсь выполнить вызов скрипта на Python из PHP с помощью команды ниже:
$output = shell_exec('python /var/www/html/sna/server/userManagement.py '. $user.' '. $pass .' \''.$action.'\' 2>&1');
Но когда я выполняю его, я получаю это
sh: 1: python: not found
Но Python правильно установлен в моей среде.
Если я введу
type -a python
Я получаю путь к Python в этой среде, как ниже
python is /home/leonardo/miniconda2/envs/sna/bin/python
В самом начале скрипта на Python я добавил
#!/usr/bin/env python
Но я постоянно получаю одну и ту же ошибку. Как я могу это исправить?
Учитывая комментарий @Anonymous:
Вызывайте Python, указывая полный путь (в вашей виртуальной среде).
PS: Комментарий не является ответом. Если вы ищете, этот вопрос без ответа менее интересен, хотя в его комментариях есть ответ. Именно поэтому я его скопировал. ВсеCredits идут другому пользователю.
Ответ или решение
Ошибка sh: 1: python: not found
возникает, когда PHP не может найти исполняемый файл Python по указанному имени в системе. Эта проблема часто связана с тем, что среда выполнения сервера (например, Apache или Nginx) отличается от вашей интерактивной оболочки, где вы установили Python.
Вот подробный анализ проблемы и шаги по её устранению:
1. Определите путь к Python
Вы уже выполнили команду type -a python
, которая возвращает путь к вашему исполняемому файлу Python в виртуальной среде:
python is /home/leonardo/miniconda2/envs/sna/bin/python
Это говорит о том, что Python установлен в конкретной виртуальной среде, и в других средах, таких как серверная, он может быть недоступен.
2. Используйте полный путь к Python
Чтобы решить проблему, измените команду в вашем коде PHP, чтобы указывать полный путь к исполняемому файлу Python:
$output = shell_exec('/home/leonardo/miniconda2/envs/sna/bin/python /var/www/html/sna/server/userManagement.py ' . $user . ' ' . $pass . ' \'' . $action . '\' 2>&1');
3. Проверьте права доступа
Убедитесь, что пользователь, под которым работает ваш веб-сервер (обычно это www-data
для Apache/Nginx), имеет права на выполнение Python и доступа к файлу userManagement.py
. Проверьте права файла с помощью:
ls -l /home/leonardo/miniconda2/envs/sna/bin/python
ls -l /var/www/html/sna/server/userManagement.py
Если права недостаточны, вы можете их изменить командой chmod
.
4. Убедитесь, что переменная окружения PATH настроена
Если вы используете виртуальную среду, убедитесь, что в вашей среде настроены определенные переменные окружения, особенно переменная PATH
. При запуске PHP через веб-сервер эта переменная может не включать путь к вашей виртуальной среде. Для временной проверки вы можете добавить вывод переменной PATH
в свой скрипт PHP:
$output = shell_exec('echo $PATH');
Если путь к вашей виртуальной среде отсутствует, рассмотрите возможность добавления его прямо в команду:
$output = shell_exec('PATH=$PATH:/home/leonardo/miniconda2/envs/sna/bin /home/leonardo/miniconda2/envs/sna/bin/python /var/www/html/sna/server/userManagement.py ' . $user . ' ' . $pass . ' \'' . $action . '\' 2>&1');
5. Проверка выполнения скриптов
Для дополнительной диагностики вы можете временно изменить вашу команду на простую, чтобы проверить, работает ли shell_exec:
$output = shell_exec('whoami');
Это покажет, от имени какого пользователя выполняется скрипт.
Заключение
Исправление ошибки sh: 1: python: not found
связано с указанием полного пути к интерпретатору Python, обеспечением прав доступа к скрипту и проверкой настроек переменной окружения. Следуя вышеперечисленным рекомендациям, вы сможете успешно запускать свои Python-скрипты из PHP. Если контекст вашей серверной среды или используемые технологии изменились, возможно, потребуется дальнейшая индивидуальная настройка.