Python in PHP aufrufen

82

Ich habe ein Python-Skript, das ich kürzlich geschrieben habe und das ich über die Befehlszeile mit einigen Optionen aufrufe. Ich möchte jetzt, dass eine sehr dünne Weboberfläche dieses Skript lokal auf meinem Mac aufruft.

Ich möchte nicht die kleinen Probleme bei der Installation von mod_python oder mod_wsgi auf meinem Mac durchgehen, also wollte ich nur ein System () oder popen () von PHP aus ausführen, um das Python-Skript aufzurufen.

Irgendwelche besseren Ideen? Danke im Voraus!

Benny Wong
quelle

Antworten:

106

Je nachdem, was Sie tun, ist system () oder popen () möglicherweise perfekt. Verwenden Sie system (), wenn das Python-Skript keine Ausgabe hat oder wenn die Ausgabe des Python-Skripts direkt an den Browser gesendet werden soll. Verwenden Sie popen (), wenn Sie Daten in die Standardeingabe des Python-Skripts schreiben oder Daten aus der Standardausgabe des Python-Skripts in PHP lesen möchten. Mit popen () können Sie nur lesen oder schreiben, nicht jedoch beide. Wenn Sie beides möchten, lesen Sie proc_open (). Bei der bidirektionalen Kommunikation zwischen Programmen müssen Sie jedoch darauf achten, Deadlocks zu vermeiden, bei denen jedes Programm darauf wartet, dass das andere etwas unternimmt .

Wenn Sie vom Benutzer bereitgestellte Daten an das Python-Skript übergeben möchten, müssen Sie unbedingt die Befehlsinjektion beachten. Wenn Sie nicht vorsichtig sind, kann Ihr Benutzer Ihnen Daten wie "; evilcommand;" senden. und lassen Sie Ihr Programm beliebige Befehle gegen Ihren Willen ausführen.

Escapeshellarg () und Escapeshellcmd () können dabei helfen, aber ich persönlich möchte alles, was kein guter Charakter ist, mit so etwas entfernen

preg_replace('/[^a-zA-Z0-9]/', '', $str)
Andru Luvisi
quelle
1
Das Unterprozessmodul wurde direkt mit os.Popen [n] ersetzt. Sie sollten das stattdessen verwenden.
Nick Stinemates
6
@ Nick Stinemates: Wir sprechen über PHP-Funktionen;)
Glaslos
Gibt es keine Lösungen, die KEINE Shell beinhalten, wie z. B. execve () von C, außer dass sie in einem separaten Prozess ausgeführt wird, anstatt zuerst fork () zu müssen?
Lie Ryan
Es gibt und es gab immer Lösungen, aber Sie müssen Python irgendwo ausführen, um etwas daraus zu machen. Sie könnten einen einfachen Python-Dienst erstellen, der nur auf Eingaben wartet, bis er welche enthält, oder Sie könnten Ihr Programm irgendwie auslösen (z. B. Linux inotify), dann gibt es diese PHP-Erweiterungen und dann gibt es lokale Sockets für Linux-Server. Python in PHP sieht aus wie die beste NoShell-Lösung, da andere (Nicht-Plugins) immer eine Art Shell um Ihren Python haben würden.
Sampo Sarrala - codidact.org
27

Mit dem Backquote-Operator können Sie auch Python-Skripte mit einer ähnlichen Syntax wie oben ausführen

In einer Python-Datei namens python.py:

hello = "hello"
world = "world"
print hello + " " + world

In einer PHP-Datei namens python.php:

$python = `python python.py`;
echo $python;
Benutzer
quelle
15

Es gibt auch eine PHP-Erweiterung: Pip - Python in PHP , die ich noch nie ausprobiert habe, aber für einen solchen Anlass mit einem Lesezeichen versehen habe

enobrev
quelle
11
Seien Sie gewarnt, der Name "pip" wird auch verwendet, um das äußerst beliebte und ziemlich standardmäßige Python-Paketverwaltungstool zu beschreiben. Dies ist also ein wirklich schlechter, verwirrender und zum Scheitern verurteilter Name für dieses PHP-Tool. Vielleicht wurde es deshalb so lange nicht aktualisiert.
GregD
2
Sieht so aus, als würde es immer noch gehen (ohne schlechte Namenswahl). Github.com/jparise/php-python
benekastah
11

Sie können ein Python-Skript über PHP ausführen und im Browser ausgeben.

Grundsätzlich müssen Sie das Python-Skript folgendermaßen aufrufen:

$command = "python /path/to/python_script.py 2>&1";
$pid = popen( $command,"r");
while( !feof( $pid ) )
{
 echo fread($pid, 256);
 flush();
 ob_flush();
 usleep(100000);
}
pclose($pid);

Hinweis: Wenn Sie time.sleep () in Ihrem Python-Code ausführen, werden die Ergebnisse nicht im Browser ausgegeben.

Vollständige Codes finden Sie unter So führen Sie Python-Skripte von PHP aus und zeigen die Ausgabe im Browser an

Idealmind
quelle
Wie man den Pfad hier relativ und absolut angibt. Grundsätzlich habe ich mein Python-Skript unter sagen wir Ordner tempmonund der gleiche Ordner enthält mein Python-Skript. Ich möchte, dass die Anwendung portabel ist, also kann ich einfach den tempmonOrdner unter kopieren htdocs. Und das gleiche sollte auf verschiedenen Maschinen funktionieren.
Krishna Oza
Perfekt gearbeitet. Sie können öffnende und schließende PHP-Tags <? Php?> Zum besseren Verständnis für Anfänger hinzufügen
Zaheer
7

Ich mache so etwas die ganze Zeit für schnelle und schmutzige Skripte. Es ist durchaus üblich, ein CGI- oder PHP-Skript zu haben, das nur system / popen verwendet, um ein externes Programm aufzurufen.

Seien Sie besonders vorsichtig, wenn Ihr Webserver für das Internet geöffnet ist. Stellen Sie in diesem Fall sicher, dass Sie Ihre GET / POST-Eingabe bereinigen, damit Angreifer keine beliebigen Befehle auf Ihrem Computer ausführen können.

Eli Courtwright
quelle
3

Ihre call_python_file.php sollte folgendermaßen aussehen:

<?php
    $item='Everything is awesome!!';
    $tmp = exec("py.py $item");
    echo $tmp;
?>

Dadurch wird das Python-Skript ausgeführt und das Ergebnis an den Browser ausgegeben. In Ihrem Python-Skript bringt die Variable (sys.argv [1:]) alle Ihre Argumente ein. So zeigen Sie das Argument als Zeichenfolge für jeden Ort an, an dem Ihr PHP abruft. Wenn Sie also einen Textbereich erstellen möchten:

import sys

list1 = ' '.join(sys.argv[1:])

def main():
  print list1

if __name__ == '__main__':
    main()
Aze
quelle
0

Beachten Sie, dass Sie bei Verwendung einer virtuellen Umgebung (wie beim Shared Hosting) Ihren Pfad zu Python anpassen müssen, z. /home/user/mypython/bin/python ./cgi-bin/test.py

Bob3411
quelle
0

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

Ich habe diese beiden Dateien

run.php

mkdir.py.

Hier habe ich eine HTML-Seite erstellt, die die Schaltfläche GO enthält. 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");
SMshrimant
quelle
-2

Wenn Sie Ihr Python-Skript in PHP ausführen möchten, müssen Sie diesen Befehl in Ihrem PHP-Skript ausführen:

exec('your script python.py')
Gouled Med
quelle
a) Leerzeichen trennen Parameter, dh dies versucht das Programm yourmit den Parametern scriptund aufzurufen python.py. b) Sofern das Python-Skript keinen richtigen Shebang hat, muss der Python-Interpreter aufgerufen und der Skriptname an ihn übergeben werden ( python script.py). Selbst mit einem richtigen Shebang ist dies falsch, da Sie dann anrufen würden, ./script.pyanstatt den Namen des Dolmetschers zu verwenden.
Tox