Я пытаюсь запустить скрипт Python из PHP с помощью следующей команды:
exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
Однако PHP просто не производит никакого вывода. Отчет об ошибках установлен на E_ALL, а display_errors включен.
Вот что я пробовал:
python2 , /usr/bin/python2 и python2.7 вместо /usr/bin/python2.7 exec , shell_exec , system . Однако, если я убегу
if (exec('echo TEST') == 'TEST') { echo 'exec works!'; }
он отлично работает, а shutdown now ничего не делает.
У PHP есть разрешения на доступ и выполнение файла.
EDIT: Благодаря Алехандро, я смог решить проблему. Если у вас есть такая же проблема, не забывайте, что ваш веб-сервер, вероятно, не работает с правами root. Попробуйте войти в систему как пользователь вашего веб-сервера или пользователь с аналогичными разрешениями и попробуйте сами выполнить команды.
Протестировано на сервере Ubuntu 10.04. Надеюсь, это поможет вам и в Arch Linux.
В PHP:
<?php $command = escapeshellcmd('/usr/custom/test.py'); $output = shell_exec($command); echo $output; ?>
В файле Python 'test.py' проверьте этот текст в первой строке: (см. Объяснение shebang) :
#!/usr/bin/env python
Также файл Python должен иметь правильные привилегии (выполнение для пользователя www-data / apache, если PHP-скрипт выполняется в браузере или через завиток) и / или должен быть «исполняемым». Также все команды в .py-файле должны иметь правильные привилегии.
chmod +x myscript.py
Я рекомендую использовать passthru и напрямую обращаться с выходным буфером:
ob_start(); passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2'); $output = ob_get_clean();
Алехандро прибил его, добавив разъяснение к исключению (Ubuntu или Debian). У меня нет ответа, чтобы добавить к самому ответу:
Файл sudoers: sudo visudo
добавлено исключение: www-data ALL=(ALL) NOPASSWD: ALL
Если вы хотите узнать статус возврата команды и получить весь вывод stdout вы можете фактически использовать exec :
$command = 'ls'; exec($command, $out, $status);
$out – массив всех строк. $status – статус возврата. Очень полезно для отладки.
Если вы также хотите увидеть вывод stderr вы можете играть с proc_open или просто добавить 2>&1 в $command . Последнее часто бывает достаточно, чтобы заставить вещи работать и быстрее «внедрять».