Raspberry Pi 3 Mod B / B+:    PHP - Python
 

Python-Programme durch
PHP aufrufen ..
mit Übergabe und Rückgabe
von Parametern
Mit der Programmiersprache Python lassen sich Programme für den Raspberry Pi schreiben. Sollen die Resultate dieser Programme durch PHP in einem Netzwerk dargestellt werden, so kann man sie durch PHP aufrufen und ihre Werte über HTML-Seiten sichtbar machen. Ebenso lassen sich HTML-Eingabeparameter an die Python-Programme übergeben, die diese dann in ihrem Programmablauf benutzen können.
Der nachfolgende Text beschreibt wie dies gelingt.
Grundeinstellungen
Python-Programme sind typischer Weise dem Benutzer 'root' zugeordnet. Dagegen wird als Benutzer von PHP-Programmen 'www-data' genannt. Damit 'www-data' auf Dateien des Benutzes root zugreifen kann, müssen in der Datei sudoers.tmp Einstellungen vorgenommen werden.
 
1. NANO Editor mit der Datei sudoers.tmp öffnen durch ..
sudo visudo
2. Rechte für www-data an dem python-Interpreter und dem zu startenden Programm hinzufügen
www-data ALL=(ALL) NOPASSWD: /usr/bin/python /usr/test.py
 
2a. Soll das Python-Programm mit Parametern gestartet werden, so für die Mindestzahl der
     Parameter einen * anfügen (im Beispiel also mindestens zwei Parameter)
www-data ALL=(ALL) NOPASSWD: /usr/bin/python /usr/test.py * *
 
3. Das PHP-Script erstellen
    <?php
    echo shell_exec("sudo python /usr/test.py");
    ?>
 
Python-Programm test.py
# python compiler unter: /usr/bin/python
# -*- coding: utf-8 -*-

# Das Programm gibt die ihm übergebenen Parameter aus. Diese
# erscheinen als Strings und können den Wünschen entsprechen zu
# Integer- oder Fließkommazahlen gewandelt und weiterverarbeitet
# werden. Der Parameter[0] enthält grundsätzlich ..
# /Pfad/und/Namen/des/Programms.py

import sys

# --------------- # Pgm: main ----------------------------------- #
# Start: python /usr/test.py

def main():
  n=0
  # x enthält die Anzahl der übergebenen Parameter
  x = len(sys.argv)
  # solange n kleiner ist als x, die übergebenen Parameter ausgeben.
  while n < x:
    print ("arg%d= %s" %(n, sys.argv[n]))
    n=n+1
  # letzte Meldung, zugleich Rückgabeparameter bei php 'exec'
  print 'Fertig .. Parameter ausgegeben'

# benennt main() als Startfunktion
if __name__=="__main__":
  main()
 
PHP-Programm test.php
<?php
// Dieses php-Programm ruft über 4 verschiedene Wege das python-
// Programm 'test.py' auf, welches in dem Verzeichsnis /usr/ ab-
// gelegt wurde. Dem Programm muß mindestens ein Parameter übergeben
// werden, mehr Parameter sind aus unbekannten Gründen möglich.
// Damit die Aufrufe 1-4 funktionieren, muß in der Datei ..
// /etc/sudoers.tmp
// über den Befehl 'visudo', der die Datei mit dem Editor 'nano'
// öffnet, der Eintrag ..

// www-data ALL=(ALL) NOPASSWD: /usr/bin/python /usr/test.py *

// .. vorgenommen werden. In diesem Eintrag kennzeichnet das Zeichen
// '*' den zu übergebenden Parameter. Wird '*' entfernt, darf kein
// Parameter übergeben werden.

// Welche Vor- bzw. Nachteile die vorgestellten Aufrufe besitzen muß
// in deren Beschreibungen erkundet werden.
// -----------------------------------------------------------------

// Test: Aufruf und Rückgabe der Ausgaben von Systembefehlen. Sie
// funktionieren ohne einen Eintrag in /etc/sudoers.tmp
// Hier als Beispiel der Aufruf von 'date'
echo 'Ausgabe des Datums<BR>';
echo '<pre>';
system('date');
echo '</pre><BR>';

// -----------------------------------------------------------------
// die Anzahl der Übergabeparameter $dat kann bis auf einen vermin-
// dert werden.
$dat1=55.7;
$dat2=202.556;
$dat3='Programm';
$dat4='TEST';
$dateiname='sudo python /usr/test.py';
// (überschüssige Übergabeparameter natürlich auch hier löschen)
$datei = $dateiname.' '.$dat1.' '. $dat2.' '.$dat3.' '.$dat4;

// 1. system: Aufruf von ausführbaren Dateien.
//    Es werden alle Rückgaben angezeigt
echo 'python programmaufruf mit system<BR>';
echo '<pre>';
system($datei);
echo '</pre><BR>';

// 2. passthru: Aufruf von ausführbaren Dateien.
//    Es werden alle Ausgaben angezeigt
echo 'python programmaufruf mit passthru<BR>';
passthru($datei);

// 3. shell_exec: Aufruf von ausführbaren Dateien.
//    Es werden alle Ausgaben zurückgegeben
$shell=shell_exec($datei);

// 4. exec: Aufruf von ausführbaren Dateien.
//    Es wird nur die letzte Ausgabe zurückgegeben
$exec=exec($datei);

// Rückgaben von shell_exec bzw. exec
// Sie werden zum Bildschirm ausgegeben
echo '<BR><BR>Rueckgabe von shell_exec<BR>',$shell;
echo '<BR><BR>Rueckgabe von exec<BR>',$exec;
?>
 
Anmerkung
Bei der Angabe einer PHP-String-Variablen bei welcher der String Freizeichen enthält, wird diese im Python-Programm zu mehreren Übergabewerten ausgewertet. Im obigen Programm ergäbe die Angabe von $dat3= 'ein Programm'; die Python Variablen arg3='ein', arg4='Programm' und $dat4='TEST' würde zu arg5 werden. Grund und Abhilfe konnten bisher nicht geklärt werden.
 
 

www.GoBlack.de