it-swarm.com.de

Ausführen eines Python - Skripts von PHP

Ich versuche, ein Python Skript von PHP mit dem folgenden Befehl auszuführen:

exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');

Allerdings erzeugt PHP einfach keine Ausgabe. Die Fehlerberichterstattung ist auf E_ALL gesetzt und display_errors ist eingeschaltet.

Folgendes habe ich versucht:

  • Ich benutzte python2, /usr/bin/python2 und python2.7 anstatt /usr/bin/python2.7
  • Ich habe auch einen relativen Pfad anstelle eines absoluten Pfades verwendet, der auch nichts geändert hat.
  • Ich habe versucht, die Befehle exec, Shell_exec, system.

Allerdings wenn ich renne

if (exec('echo TEST') == 'TEST')
{
    echo 'exec works!';
}

es funktioniert einwandfrei, während shutdown now macht nichts.

PHP hat die Berechtigung, auf die Datei zuzugreifen und sie auszuführen.

EDIT: Dank Alejandro konnte ich das Problem beheben. Wenn Sie das gleiche Problem haben, vergessen Sie nicht, dass Ihr Webserver wahrscheinlich/hoffentlich nicht als Root ausgeführt wird. Melden Sie sich als Benutzer Ihres Webservers oder als Benutzer mit ähnlichen Berechtigungen an und versuchen Sie, die Befehle selbst auszuführen.

99

Getestet auf Ubuntu Server 10.04. Ich hoffe es hilft dir auch auf Arch Linux.

In PHP benutze Shell_exec :

Führen Sie den Befehl über die Shell aus und geben Sie die gesamte Ausgabe als String zurück.

Es gibt die Ausgabe des ausgeführten Befehls oder NULL zurück, wenn ein Fehler aufgetreten ist oder der Befehl keine Ausgabe erzeugt.

<?php 

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

?>

In Python file test.py, überprüfe diesen Text in der ersten Zeile: (siehe Shebang EXPLAIN) :

#!/usr/bin/env python

Auch Python file muss über die richtigen Berechtigungen verfügen (Ausführung für Benutzer www-data/Apache, wenn PHP script läuft im Browser oder curl) und/oder muss "ausführbar" sein. Auch alle Befehle in .py Datei muss die richtigen Rechte haben:

Genommen von PHP-Handbuch :

Nur eine kurze Erinnerung für diejenigen, die versuchen, Shell_exec auf einer Unix-Plattform zu verwenden, und es nicht zum Laufen zu bringen scheinen. PHP wird als Webbenutzer auf dem System ausgeführt (in der Regel www für Apache), daher müssen Sie sicherstellen, dass der Webbenutzer Rechte für alle Dateien oder Verzeichnisse hat, die Sie in verwenden möchten Shell_exec-Befehl. Andernfalls scheint er nichts zu tun.

Um eine Datei auf Unix-Plattformen ausführbar zu machen :

chmod +x myscript.py
136

Ich empfehle die Verwendung von passthru und den direkten Umgang mit dem Ausgabepuffer:

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

Wenn Sie den Rückgabestatus des Befehls kennen und die gesamte Ausgabe von stdout erhalten möchten, können Sie tatsächlich exec verwenden. :

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

$out Ist ein Array aller Zeilen. $status Ist der Rückgabestatus. Sehr nützlich zum Debuggen.

Wenn Sie auch die Ausgabe von stderr sehen möchten, können Sie entweder mit proc_open spielen oder einfach 2>&1 Zu Ihrem $command Hinzufügen. Letzteres reicht oft aus, um Dinge zum Laufen zu bringen und um sie schneller "umzusetzen".

13
guaka

Alejandro nagelte es und fügte der Ausnahme Klarheit hinzu (Ubuntu oder Debian) - ich habe nicht den Repräsentanten, der Antwort selbst hinzuzufügen:

sudoers-Datei: Sudo visudo

ausnahme hinzugefügt: www-data ALL=(ALL) NOPASSWD: ALL

9
Colin Miles

Um zu klären, welcher Befehl je nach Situation verwendet werden soll

exec() - Führt ein externes Programm aus

system() - Führt ein externes Programm aus und zeigt die Ausgabe an

passthru() - Führt ein externes Programm aus und zeigt die Rohdaten an

Quelle: http://php.net/manual/en/function.exec.php

5
Agnel Vishal

In meinem Fall musste ich einen neuen Ordner im Verzeichnis www mit dem Namen scripts erstellen. Innerhalb von scripts habe ich eine neue Datei mit dem Namen test.py Hinzugefügt.

Ich habe dann Sudo chown www-data:root scripts Und Sudo chown www-data:root test.py Verwendet.

Dann ging ich in das neue Verzeichnis scripts und benutzte Sudo chmod +x test.py.

Meine test.py-Datei sieht so aus. Beachten Sie die unterschiedliche Python Version:

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

Von PHP mache ich jetzt Folgendes:

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

Und du solltest sehen: Hallo Welt!

3
Tim Hallman

Die oben genannten Methoden scheinen komplex zu sein. Verwenden Sie meine Methode als Referenz.

Ich habe diese zwei Dateien:

  • run.php

  • mkdir.py

Hier habe ich eine HTML-Seite erstellt, die eine enthält GO Taste. Jedes Mal, wenn Sie diese Taste drücken, wird ein neuer Ordner in dem Verzeichnis erstellt, dessen Pfad Sie angegeben haben.

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

Das ist so trivial, aber ich wollte nur allen helfen, die Alejandros Vorschlag bereits befolgt haben, aber auf diesen Fehler gestoßen sind:

sh: blabla.py: Befehl nicht gefunden

Wenn jemand auf diesen Fehler stößt, muss Alejandro eine kleine Änderung an der PHP-Datei vornehmen:

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