Я пытаюсь запустить скрипт 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
. Последнее часто бывает достаточно, чтобы заставить вещи работать и быстрее «внедрять».