it-swarm.com.ru

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

97
Abandoned account

Протестировано на 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 проверьте этот текст в первой строке: (см. Объяснение Шебанга) :

#!/usr/bin/env python

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

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

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

Чтобы сделать исполняемый файл на платформах Unix-типа :

chmod +x myscript.py
135
Alejandro Quiroz

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

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

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

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

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

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

13
guaka

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

файл sudoers: Sudo visudo

добавлено исключение: www-data ALL=(ALL) NOPASSWD: ALL

9
Colin Miles

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

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

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

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

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

4
Agnel Vishal

В моем случае мне нужно было создать новую папку в каталоге 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!

3
Tim Hallman

Вышеуказанные методы кажутся сложными. Используйте мой метод в качестве ссылки.

У меня есть эти два файла:

  • run.php

  • mkdir.py

Здесь я создал страницу HTML, которая содержит GO кнопка. Каждый раз, когда вы нажимаете эту кнопку, в каталоге, путь которого вы указали, будет создана новая папка.

run.php

<html>
 <body>
  <head>
   <title>
     run
   </title>
  </head>

   <form method="post">

    <input type="submit" value="GO" name="GO">
   </form>
 </body>
</html>

<?php
        if(isset($_POST['GO']))
        {
                Shell_exec("python /var/www/html/lab/mkdir.py");
                echo"success";
        }
?>

mkdir.py

#!/usr/bin/env python    
import os    
os.makedirs("thisfolder");
2
Smshrimant

Это так тривиально, но я просто хотел помочь любому, кто уже последовал предложению Алехандро, но столкнулся с этой ошибкой:

sh: blabla.py: команда не найдена

Если кто-то сталкивался с этой ошибкой, то Alejandro должен внести небольшие изменения в php-файл:

$command = escapeshellcmd('python blabla.py');
1
Gerald Joshua