Запуск скрипта Python из PHP

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