Вопрос-Ответ

Running a Python script from PHP

Запуск скрипта 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 есть разрешения на доступ к файлу и его выполнение.

РЕДАКТИРОВАТЬ: Благодаря Алехандро, я смог устранить проблему. Если у вас такая же проблема, не забывайте, что ваш веб-сервер, вероятно / надеюсь, не запускается от имени root. Попробуйте войти в систему как пользователь вашего веб-сервера или пользователь с аналогичными разрешениями и попробуйте выполнить команды самостоятельно.

Переведено автоматически
Ответ 1

Протестировано на Ubuntu Server 10.04. Надеюсь, это поможет вам и в Arch Linux.

В PHP используйте функцию shell_exec:


Выполните команду через shell и верните полный вывод в виде строки.


Он возвращает выходные данные выполненной команды или NULL, если произошла ошибка или команда не выдает выходных данных.


<?php 

$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;

?>

В файл Python test.py, проверьте этот текст в первой строке: (см. Объяснение shebang):

#!/usr/bin/env python

Если у вас установлено несколько версий Python, /usr/ bin /env будет
гарантировать, что используемый интерпретатор является первым в вашей среде
$PATH . Альтернативой было бы жестко запрограммировать что-то вроде
#!/usr/bin/python; это нормально, но менее гибко.


В Unix исполняемый файл, предназначенный для интерпретации, может указывать, какой интерпретатор использовать, имея #! в начале первой строки, за которым следует интерпретатор (и любые флаги, которые ему могут понадобиться).


Если вы говорите о других платформах, конечно, это правило неприменимо (но эта "шаблонная строка" не причиняет вреда и поможет, если вы когда-нибудь скопируете этот скрипт на платформу с базой Unix, такую как Linux, Mac и т.д.).



Это применимо, когда вы запускаете его в Unix, делая его исполняемым (chmod + x myscript.py), а затем запускаете его напрямую : ./myscript.py , а не только python myscript.py


Для создания исполняемого файла на платформах типа unix:

chmod +x myscript.py

Также файл Python должен иметь правильные привилегии (выполнение для пользователя www-data / apache, если PHP-скрипт запускается в браузере или curl)
и / или должен быть "исполняемым". Также все команды в .py файле должны иметь правильные привилегии.

Взято из руководства по php:


Просто краткое напоминание для тех, кто пытается использовать shell_exec на платформе типа unix и, похоже, не может заставить его работать. PHP выполняется в системе от имени веб-пользователя (обычно www для Apache), поэтому вам нужно убедиться, что веб-пользователь имеет права на любые файлы или каталоги, которые вы пытаетесь использовать в команде shell_exec. В остальном, похоже, что он ничего не делает.


Ответ 2

Я рекомендую использовать passthru и обрабатывать выходной буфер напрямую:

ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean();
Ответ 3

Если вы хотите узнать состояние возврата команды и получить весь stdout вывод, который вы можете на самом деле использовать exec:

$command = 'ls';
exec($command, $out, $status);

$out это массив всех строк. $status это состояние возврата. Очень полезно для отладки.

Если вы также хотите увидеть stderr результат, вы можете либо поиграть с proc_open, либо просто добавить 2>&1 в свой $command. Последнего часто бывает достаточно, чтобы заставить все работать и намного быстрее "реализовать".

Ответ 4

Чтобы уточнить, какую команду использовать в зависимости от ситуации

exec() - Выполнить внешнюю программу

system() - Выполнить внешнюю программу и отобразить выходные данные

passthru() - Выполнение внешней программы и отображение необработанных выходных данных

Источник: http://php.net/manual/en/function.exec.php

python linux