Запуск сценарію Python від PHP


114

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


Спочатку відвідайте цю проблему stackoverflow.com/questions/21659637/… Якщо це не вирішено, і у вас з’являються такі проблеми, як In Case, якщо ви застрягли з імпортом, або tty, або немає пропускного листа, не перевірте, перевірте це посилання, щоб дізнатись детальні кроки щодо його виконання. stackoverflow.com/a/57978771/9470457 Дякую !!!
3рді

Відповіді:


159

Тестовано на Ubuntu Server 10.04. Я сподіваюся, що це допоможе вам і в Arch Linux.

У PHP використовуйте shell_exec функцію :

Виконати команду через оболонку та повернути повний вихід у вигляді рядка.

Він повертає висновок із виконаної команди або NULL, якщо сталася помилка або команда не видає виводу.

<?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файл повинні мати правильні привілеї:

Взято з посібника з php :

Це лише швидке нагадування для тих, хто намагається використовувати shell_exec на платформі unix-типу і, здається, не може змусити його працювати. PHP виконується як веб-користувач у системі (як правило, www для Apache), тому вам потрібно переконатися, що веб-користувач має права на всі файли чи каталоги, які ви намагаєтеся використовувати в команді shell_exec. Інші мудрі, здається, нічого не роблять.

Щоб зробити виконуваний файл на платформах unix типу :

chmod +x myscript.py

6
Дякую, що зробили трюк! Була ще одна проблема - користувач Apache не зміг виконати команду в сценарії Python, але я зміг виправити це за допомогою sudo та додавши виняток для мого сценарію до файлу sudoers. Знову дякую! :)
Покинутий рахунок

1
Я зіткнувся з тією ж проблемою користувача apache, чи можете ви мене просити?
Емма

1
Я використав вашу відповідь, він добре виконує сценарій python, але я не можу повторити результати, нічого не з’являється на веб-сторінці, чи можете ви мені допомогти.
Хамді Шареф

1
"#! / usr / bin / env python" на першому рядку зробив для мене трюк. Чудово!
C3PO

1
Для OSX: echo shell_exec("/usr/local/bin/python3 /Users/cyborg/Dev/magic.py"); або:echo shell_exec("/usr/bin/python /Users/cyborg/Dev/magic.py");
Кіборг

24

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

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

16

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

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

$out- це масив усіх рядків. $status- це стан повернення. Дуже корисно для налагодження.

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


8

Алехандро прибив це, додавши пояснення до винятку (Ubuntu або Debian) - у мене немає відповіді, щоб додати до самої відповіді:

файл судорів: sudo visudo

виняток додано: www-data ALL=(ALL) NOPASSWD: ALL


7
Не здається ефективним додавати www-дані до sudoers і надає apache більше дозволів, які йому потрібні. Надання дозволів www-даних для сценарію, який ви виконуєте, буде достатньо.
JasonRDalton

Хороша ідея, але, безумовно, може зробити вашу систему вразливою. Я згоден з @JasonRDalton
Рід

6

Уточнити, яку команду використовувати, виходячи з ситуації

exec() - Виконати зовнішню програму

system() - Виконати зовнішню програму та відобразити вихід

passthru() - Виконати зовнішню програму та відобразити вихідний вихід

Джерело: http://php.net/manual/en/function.exec.php


4

У моєму випадку мені потрібно було створити нову папку в 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

Наведені вище методи здаються складними. Використовуйте мій метод як орієнтир.

У мене є ці два файли:

  • 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");

1

Це настільки банально, але просто хотілося допомогти кожному, хто вже дотримувався пропозиції Алехандро, але зіткнувся з цією помилкою:

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

Якщо хтось зіткнувся з цією помилкою, то слід змінити файл php від Алехандро:

$command = escapeshellcmd('python blabla.py');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.