2013-11-01 7 views
63

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

ответ

98

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

В PHP:

<?php 

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

?> 

В файле Python test.py, проверить этот текст в первой строке: (see shebang explain):

#!/usr/bin/env python 

Также Python файл should have correct privileges (выполнение для пользователя WWW-данных/апача, если PHP сценарий запускается в браузере или через завиток) и/или должен быть «исполняемым». Также все команды в файле .py должны иметь правильные привилегии.

chmod +x myscript.py 
+6

Спасибо, что сделал трюк! Возникла еще одна проблема: пользователь Apache не смог выполнить команду в скрипте Python, но я смог исправить это, используя sudo и добавив исключение для моего скрипта в файл sudoers. Еще раз спасибо! :) –

+0

Я столкнулся с такой же проблемой пользователя apache, можете ли вы мне помочь? – Emma

+1

Я использовал ваш ответ, он отлично выполняет скрипт python, но я не могу повторить результаты, которые ничего не отображаются на веб-странице, вы можете мне помочь. –

13

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

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

Алехандро прибил его, добавив разъяснение, за исключением (Ubuntu или Debian) - У меня нет респ, чтобы добавить к сам ответ:

sudoers файл: добавлено sudo visudo

исключение: www-data ALL=(ALL) NOPASSWD: ALL

+5

Не кажется эффективным для добавления www-данных в sudoers и дает apache больше разрешений, которые ему нужны. Достаточно предоставить разрешения на использование www-данных для исполняемого скрипта. – JasonRDalton

8

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

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

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

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

0

В моем случае мне нужно было создать новую папку в каталоге www с именем scripts. В пределах scripts я добавил новый файл под названием test.py.

Я тогда использовал sudo chown www-data:root scripts и sudo chown www-data:root test.py.

Затем я перешел в новый каталог scripts и использовал sudo chmod +x test.py.

Этот файл test.py выглядит так. Обратите внимание на другую версию Python:

#!/usr/bin/env python3.5 
print("Hello World!") 

От PHP я теперь сделать это:

$message = exec("/var/www/scripts/test.py 2>&1"); 
print_r($message); 

И вы увидите: Hello World!

Смежные вопросы