Mit exec() von PHP Python-Code nutzen?

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

So versuche ich gerade, mein Python-Know-How auf meinem (angemieteten) Webspace auszuführen. Aber da erhalte ich nur einen Array, der die Ausgabe enthält. Keine grafischen Möglichkeiten, mein Input, ... nur Skript?
Wie kann ich auf meinem Webserver Python-Dateien zum Laufen bekommen? Bisher nutze ich eben nur .php und .htm Dateien. Gibt es eine Möglichkeit, wie ich alle Libraries und Funktionen von Python dort programmieren/testen kann?

Danke euch
PythonTrader
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
BlackJack

@PythonTrader: Wo erhältst Du nur ein Array das die Ausgabe enthält? Und was ist ein Array in diesem Kontext? Was hat die Frage im Betreff mit dem Beitrag zu tun? Beschreib doch mal bitte was Du genau machst, was Du als Ergebnis bekommst, und was Du stattdessen erwartet hast.
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

BlackJack hat geschrieben:@PythonTrader: Wo erhältst Du nur ein Array das die Ausgabe enthält? Und was ist ein Array in diesem Kontext? Was hat die Frage im Betreff mit dem Beitrag zu tun? Beschreib doch mal bitte was Du genau machst, was Du als Ergebnis bekommst, und was Du stattdessen erwartet hast.
Vielen Dank fürs Nachfragen!

Bei einem Beispiel-Code (py + php) kommt das hier heraus:

Ausgabe des Scripts:
Array
(
[0] => ('Gehe ', 10, 'Felder vor.')
[1] => Pasch! Wuerfel noch einmal!
)


php:

Code: Alles auswählen

<?php
exec("/usr/bin/python ./dice.py 2>&1", $out, $result);
echo "Returncode: " .$result ."<br>";
echo "Ausgabe des Scripts: " ."<br>";
echo "<pre>"; print_r($out);
Ich habe schon direkt mit "echo $out[0];" u.ä. experimentiert, aber das passiert alles nach der kompletten Ausführung des Skripts.
Gibt es eine Möglichkeit, Python direkt im Browser auszuführen - vielleicht sogar ohne PHP?
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Geht es dir darum, Ausgaben für den Browser des Besuchers mit Python zu erzeugen? Dann lautet das Stichwort Web-Framework. Prominente Beispiele, wenn es im kleineren Rahmen bleibt, sind Bottle oder Flask. Für Aufgaben im großen Stil eignet sich Django ganz gut. Jedenfalls kannst du mit diesen Frameworks HTML-Ausgaben erzeugen und diese an den Client (Browser) ausliefern.
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

Vielleicht ist das perfekt für mich, danke.

Mir geht es allerdings nur darum, dass ich selbst die Ausgaben sehe. Es könnte also auch ohne Browser funktionieren, aber irgendwie über den Server laufen, da ich die Ausgaben auch auf iPad und iPhone betrachten möchte (alles iOS/macOS-Systeme).

Gibt es da eine bessere/einfachere Möglichkeit?

Für mich wäre der Punkt wichtig, wie ich bei meinem Server-Anbieter Python ausführe, da ich dort nicht alle Rechte habe. Scheinbar erlaubt er nur die Skript-Zugriffe und keine Ausgabe à la "python test.py".

Habe dazu nirgends etwas gefunden und der Support kann mir auch nicht weiterhelfen.

Grüße und vielen Dank fürs Annähern an eine Lösung
PythonTrader
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
BlackJack

@PythonTrader: Also mir ist immer noch nicht so ganz klar was Du eigentlich erreichen möchtest.

Natürlich bekommst Du die Ausgaben erst wenn das Programm komplett durchgelaufen ist. So funktionieren PHP und HTTP nun mal: Der Browser stellt *eine* Anfrage und bekommt *eine* Antwort. Wenn sich zwischen zwei Anfrage/Antwort-Paaren Zustand gemerkt werden muss, dann muss man das explizit auf dem Server *machen* (oder Client). Also bei Daten zum Beispiel in einer Datenbank und/oder in Cookies. Wenn Zustand gefragt ist, der sich nicht so einfach als Daten speichern lässt, zum Beispiel ein vorhandenes Konsolenprogramm mit dem man kommunizieren möchte, dann braucht man einen Server der das Programm ausführt und mit den Anfrage/Antwort-Zyklen von HTTP zusammenarbeitet. Das geht mit PHP soweit ich weiss nicht. Einschränkung dabei wäre immer noch das die Kommunikation mit dem Programm vom Client per Anfrage getrieben wird und das Ende der Antwort vom Programm für den Server der es ausführt irgendwie erkennbar ist.

Falls diese Einschränkung nicht erfüllt ist, müsste man vom Client regelmässig ”pollen” oder so etwas wie Websockets zur Kommunikation verwenden.

Die Ausgabe sieht übrigens danach aus als wenn Du ein Python 3 Programm mit Python 2 ausführst.

Kann man die `dice.py` eigentlich direkt mit dem Browser abfragen? Das wäre eine potentielle Sicherheitslücke!

Es gibt glaube ich mindestens zwei mehr oder wenige vollständige Python-Implementierungen in JavaScript, die man dann direkt im Browser ausführen kann. Das eine ist Brython, der Name des anderen Projekts fällt mir gerade nicht ein. Die Suchmaschine ist Dein Freund.

Hast Du einen Shellzugang zum Server? Oder darfst Du dort lang laufende Programme/Daemons/Server starten? Dann könnte man etwas wie AjaxTerm oder shellinabox verwenden wenn es per Browser ausführbar sein soll.

Gibt es für iOS kein Python? Für Android gibt's das.
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

Ich fange nochmal von vorne an:

1.
Ich gehe davon aus, dass ich Python-Programme über eine Shell mit "python test.py" starte. Das geht bei meinem Server-Paket aktuell nicht, weshalb ich eine andere Lösung suche. Liege ich aber richtig, dass dieser Gedankengang richtig ist?

2.
Ich habe bei meinem Anbieter angefragt und nur die Lösung einer Skript-Ausführung über PHP erhalten. Über exec().
Hier erhalte ich nach der Ausführung einen Array, den ich anzeigen kann. Das ist nicht(!) normal, wie oben beschrieben, denn wenn ich bspw. php ausführe, dann erscheint eine print-Ausgabe sofort und ich erhalte nicht erst am Ende eines Programms einen Array mit allen print-Ausgaben, den ich dann anzeigen kann. Somit ist keinerlei Input möglich, geschweige denn grafische Anzeigen - ausser der Weg über Ausgaben in Dateien.

3.
Ich kann Möglichkeit (1) nicht anwenden und (2) ist extrem unbefriedigend, da ich frei und ohne Grenzen mit Python programmieren möchte. Welche Möglichkeiten habe ich dann noch?

4.
Ja, ich könnte Python lokal auf dem MacBook installieren, müsste dann aber dort alles einrichten und auf dem iPad alles einrichten und die Programme in der Cloud ablegen. Sehr kompliziert, wie ich finde.

Könnt ihr mir weiterhelfen?
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
BlackJack

Ad 1.: Wie man Python-Programme startet, hängt von der Art des Programms und teilweise auch vom System ab. Man kann auf vielen Systemen es auch so einrichten, dass das Programm direkt gestartet werden kann, also einfach durch Eingabe von ``test.py`` beziehungsweise ``./test.py`` oder durch klicken auf ein Icon, oder über ein Menü, oder ….

Und dann können diese Programme alles mögliche machen. Kurz irgendwas erledigen, ohne jegliche Interaktion mit dem Benutzer. Etwas in der Konsole ausgeben. Dort eine Antwort vom Benutzer erwarten. Oder erst eine Eingabe erwarten und dann etwas ausgeben. Oder einen Dialog mit dem Benutzer führen. Eingaben vom Aufrufer über die Argumente beim Programmstart erwarten. Die Konsole leeren, farbige Zeichen an beliebigen Stellen in der Konsole ausgeben, ”piepsen”. Auf einem System mit einer grafischen Oberfläche Fenster öffnen. 3D-Grafik mit OpenGL anzeigen. Oder es kommuniziert über das Netz mit anderen Programmen. Oder es greift auf Hardware wie Sensoren, LEDs, Motoren, usw. zu. Oder eine Mischung aus all dem.

Das scheint bei Deinem Server-Paket nicht zu gehen. Einiges davon auch grundsätzlich eher nicht auf einem Server.

Ad 2.: Bei PHP erscheint Deine ``print``-Ausgabe (war das nicht ``echo``) *nicht* sofort. Es sei denn Du hast einen Shellzugang zum Server und startest dort PHP mit ``-f`` und dem Dateinamen der PHP-Datei oder ”pipe”st die Datei rein, oder startest den PHP-Interpreter mit ``-a`` interaktiv. Dazu bräuchtest Du aber einen Shellzugang. Ansonsten hast Du auch bei PHP einen Anfrage/Antwort-Zyklus der von HTTP kommt, und musst Dein Programm so schreiben, dass Zustände von einer zur nächsten Anfrage irgendwie persistent gespeichert werden. Beispielsweise in einer Datenbank.

Eingaben vom Benutzer sind genau so möglich wie in PHP auch — über die Anfrage. Da kann der Browser auf zwei wegen Daten liefern: über die URL und im Body der Anfrage. Und grafische Ausgaben sind ebenfalls möglich in dem man Anfragen mit HTML oder Grafiken beantwortet.

Was man auf diese Weise in PHP erreichen kann, geht in Python auch. Notfalls per CGI, das wäre aber IMHO nur ein Notnagel wenn der Server-Anbieter Python nicht über WSGI anbietet. Sollte nur CGI für Python möglich sein, dann würde ich soweit gehen zu sagen das Server-Paket bietet kein Python.

Ad 3.: Frei und ohne Grenzen wie in Ad 1. beschrieben geht nur lokal. Wenn Du einfach nur Konsolenanwendungen in einem Terminal(emulator) ausführen möchtest, bräuchtest Du einen Server mit SSH-Zugang wo Du dann ganz normal die Programme ausführen kannst. Und das oder die entsprechenden Programme auf dem Client. Also SSH und Terminalemulator. Sollte auf MacOS beides bereits vorhanden sein, und für iOS gibt's ganz sicher Apps dafür.

Ich persönlich habe Zuhause einen Raspberry Pi 24/7 im Betrieb und einen SSH-Zugang (nach „port knocking“) von aussen. Das heisst ich kann mich überall wo ich Netzzugang habe, dort an einer Konsole anmelden und alles machen was man über eine Konsole eben so machen kann mit einem Debian Server. Wenn ich einen VNC-Server starte, sogar grafische Programme starten und über einen VNC-Client bedienen.

Ad 4.: Frei und ohne Grenzen auf Mobilgeräten ist sowieso nicht möglich. Solange da kein ganz ”normales” Linux oder Windows läuft zumindest, denn dann hat man von der Plattform und von der Hardware Einschränkungen, die man auf einem Desktoprechner nicht hat.

----

Mir ist ja immer noch nicht so ganz klar *was* Du überhaupt machen willst mit Python.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@PythonTrader:
Wenn Dein Hoster bei der Frage nach Ausführen von Pythonskripten nur mit `exec` in PHP um die Ecke kommt, dann hilft nur eines - Hoster wechseln und ein paar Euro mehr investieren. Die Billigwebspace-Lockangebote taugen idR nicht für anspruchsvollere Serversachen.

Falls der Hoster langlebige Prozesse aus PHP heraus erlaubt, kannst Du zumindest Batchskripte abfeuern, die im Hintergrund ihren Dienst machen. Interaktion geht damit auch, wenn Du weisst, wie das Skript dafür zu bauen ist. Echte Terminalinteraktion bekommst Du nur, wenn Du ein Pseudoterminal erstellen darfst, was die meisten PHP-Billigangebote verbieten. Aber beides möchte man eigentlich nicht über HTTP einrichten, dann doch lieber gleich SSH-Zugriff.
Antworten