run Python script from PHP

Ciekawostka, którą potrzebowałem niedawno wykorzystać.

Uruchomienie skryptu Pythona poprzez PHP, czyli np. uruchomienie strony www.

Serwer pracujący pod Apache2, PHP chyba 5.6 (zresztą to nie ma chyba większego znaczenia), Python 2.7 w tym wypadku.

w PHP wygląda to tak:

<?php 
echo '...'.date("Y-m-d H:i:s").'<br>';
$only_path = '/home/wiks/Dokumenty/projects/weather/python2/php_fired.py'; $command = escapeshellcmd($only_path); $output = shell_exec($command); echo $output; echo '<br>'.date("Y-m-d H:i:s").' <-- już :-) ';

* jeśli miast shell_exec() byłoby exec(), otrzymalibyśmy na wyjściu tylko ostatnią wyprintowaną linijkę, a chcielibyśmy przecież całość…

zaś w Pythonie: php_fired.py

#!/usr/bin/env python
# coding=utf-8

[...]

# output poprzez zwykłe:
print('coś tam')  # to działa, ale:
# print(u'coś tam') # powoduje błąd, więc trzeba tak:
print(u'coś tam'.encode('utf-8'))  # to działa

# ja zaś potrzebowałem zamiany tekstu na mowę, i po kilku próbach optymalne jest takie rozwiązanie:
# - przy czym tekst wejściowy jest UNICODE

c = 'espeak -v pl -w ' + fpath + '/' + fname + ' -k5 "%s" ' % text2spaech
execute_unix(c.encode('utf-8'))

W powyższym przypadku tekst z PRINT jest drukowany w przeglądarce.

Oczywiście Python musi być wykonywalny (chmod +x php_fired.py) – w moim wypadku przez www-data, bardzo istotna jest pierwsza linijka w skrypcie Pythona:
#!/usr/bin/env python jeśli używamy virtual-env to czasem nie jest ona potrzebna, w tym wypadku jednak tak.

Kolejnym pytaniem jak przesłać dane do PHP a później przekazać je do Pythona?

Ja testowałem zrobiłem to tak:

Python tworzy dict, zamienia go na JSON i wywołuje request.post z tymi danymi, request.post wywołuje PHP, które przekazuje dane POST/JSON do skryptu Pythona, który testowo zwraca je do PHP poprzez print, zaś PHP poprzez echo do testującego skryptu Python’a 🙂

testujący skrypt Pythona:

– tworzy dane:

post_data = {'arg1': 'tralala',
             'arg2': 123.45,
             'arg3': 'ułnicode str ąśćęłóźć ',
             'arg4': u'ułnicode str ąśćęłóźć ',
             }

i wysyła pod:

url = 'http://localhost/run_python.php'
res = requests.post(url, json.dumps(post_data))

pod powyższym adresem jest PHP, które odbiera poprzez:

$raw_data = file_get_contents( 'php://input' );
// print_r($raw_data); //{"arg1": "tralala", "arg2": 123.45, "arg3": "u\u0142nicode str \u0105\u015b\u0107\u0119\u0142\u00f3\u017a\u0107 ", "arg4": "u\u0142nicode str \u0105\u015b\u0107\u0119\u0142\u00f3\u017a\u0107 "}
$data = json_decode( $raw_data, true );
// print_r($data);
/* Array
   (
   [arg1] => tralala
   [arg2] => 123.45
   [arg3] => ułnicode str ąśćęłóźć
   [arg4] => ułnicode str ąśćęłóźć
   ) */

przetwarza dane do linijki CLI i wywołuje Pythona:

w poniższy sposób:

$cli_data = '';
foreach($data as $key => $value) {
    $cli_data .= '"'.$key.'='.$value.'" ';
}
$command = '/home/wiks/Dokumenty/projects/weather/python2/php_fired.py '.$cli_data;
// echo $command."\n";
// /home/wiks/Dokumenty/projects/weather/python2/php_fired.py "arg1=tralala" "arg2=123.45" "arg3=ułnicode str ąśćęłóźć " "arg4=ułnicode str ąśćęłóźć "
$output = shell_exec($command);
echo $output; // to jest znów zwracane do Pythona

Python:

print 'argumenty:',
for one in sys.argv:
    print one  

otrzymujemy:

argumenty: /home/wiks/Dokumenty/projects/weather/python2/php_fired.py
arg1=tralala
arg2=123.45
arg3=ułnicode str ąśćęłóźć
arg4=ułnicode str ąśćęłóźć

Trochę czasu mi zajęło dociekanie jak (ładniej) przetworzyć dane JSON Python <–> PHP <–> Python, dzięki tej dokumentacji:

http://php.net/manual/en/security.magicquotes.disabling.php

zwróciłem uwagę na przeszkadzające magic_quotes . Zaiste ‚magic’!. Po wyłączeniu – ominięciu -wszystko przestało być magiczne i stało się bardziej logiczne…

 

Gdyby chcieć to przetestować poprzez PHP, mogłoby to wyglądać tak…

źródła:
https://stackoverflow.com/questions/19735250/running-a-python-script-from-php

https://dev.to/dev_nope/catch-and-parse-json-post-data-in-php-1p56

Radości!
WikS

Loading Disqus Comments ...
Loading Facebook Comments ...

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *