Wywołanie Pythona w PHP

83

Mam skrypt w Pythonie, który niedawno napisałem, i który wywołuję za pomocą wiersza poleceń z kilkoma opcjami. Chcę teraz mieć bardzo cienki interfejs WWW, aby wywoływać ten skrypt lokalnie na moim Macu.

Nie chcę robić drobnych problemów z instalacją mod_python lub mod_wsgi na moim Macu, więc zamierzałem po prostu zrobić system () lub popen () z PHP, aby wywołać skrypt Pythona.

Jakieś lepsze pomysły? Z góry dziękuję!

Benny Wong
źródło

Odpowiedzi:

106

W zależności od tego, co robisz, system () lub popen () mogą być idealne. Użyj system (), jeśli skrypt w języku Python nie ma wyjścia lub jeśli chcesz, aby dane wyjściowe skryptu w języku Python były kierowane bezpośrednio do przeglądarki. Użyj popen (), jeśli chcesz zapisać dane na standardowe wejście skryptu Pythona lub odczytać dane ze standardowego wyjścia skryptu Python w php. popen () pozwoli ci tylko czytać i pisać, ale nie jedno i drugie. Jeśli chcesz mieć jedno i drugie, wypróbuj proc_open () , ale przy dwukierunkowej komunikacji między programami musisz uważać, aby uniknąć zakleszczeń, w których każdy program czeka, aż drugi coś zrobi.

Jeśli chcesz przekazać dane dostarczone przez użytkownika do skryptu Pythona, najważniejszą rzeczą, na którą należy uważać, jest wstrzyknięcie poleceń. Jeśli nie jesteś ostrożny, twój użytkownik może wysłać ci dane takie jak "; evilcommand;" i spraw, aby twój program wykonywał dowolne polecenia wbrew twojej woli.

escapeshellarg () i escapeshellcmd () mogą w tym pomóc, ale osobiście lubię usuwać wszystko, co nie jest znaną dobrą postacią, używając czegoś takiego jak

preg_replace('/[^a-zA-Z0-9]/', '', $str)
Andru Luvisi
źródło
1
Moduł podprocesu został zastąpiony bezpośrednio przy użyciu os.Popen [n]. Zamiast tego powinieneś użyć tego.
Nick Stinemate
6
@Nick Stinemat: Mówimy o funkcjach PHP;)
Glaslos
czy nie ma rozwiązań, które NIE obejmowałyby powłoki, jak execve () w C, z wyjątkiem tego, że działa w oddzielnym procesie zamiast najpierw forsować ().
Lie Ryan
Są i zawsze były rozwiązania, ale musisz gdzieś uruchomić Pythona, aby coś z tego wyciągnąć. Możesz stworzyć prostą usługę Pythona, która po prostu czeka na dane wejściowe, aż będzie miała jakieś dane, lub możesz w jakiś sposób uruchomić program (na przykład linux inotify), wtedy są te rozszerzenia PHP, a następnie są lokalne gniazda dla serwerów linuxowych. Python w PHP wygląda na najlepsze rozwiązanie NoShell, ponieważ inne (nie będące wtyczkami) zawsze miałyby jakąś powłokę wokół twojego Pythona.
Sampo Sarrala - codidact.org
27

Operator odwrotnego cudzysłowu umożliwia również uruchamianie skryptów Pythona przy użyciu podobnej składni do powyższej

W pliku Pythona o nazwie python.py:

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

W pliku php o nazwie python.php:

$python = `python python.py`;
echo $python;
użytkownik
źródło
15

Jest też rozszerzenie PHP: Pip - Python w PHP , którego nigdy nie próbowałem, ale dodałem go do zakładek właśnie na taką okazję

enobrev
źródło
11
Ostrzegamy, że nazwa „pip” jest również używana do opisania niezwykle popularnego i dość standardowego narzędzia do zarządzania pakietami w Pythonie, więc jest to naprawdę zła, zagmatwana i skazana na zagładę nazwa tego narzędzia PHP. Może dlatego nie był aktualizowany tak długo.
GregD
2
Wygląda na to, że nadal działa (bez złego wyboru nazwy) github.com/jparise/php-python
benekastah
11

Możesz uruchomić skrypt w Pythonie za pośrednictwem php i wyjść w przeglądarce.

Zasadniczo musisz wywołać skrypt w Pythonie w ten sposób:

$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);

Uwaga: jeśli uruchomisz time.sleep () w swoim kodzie Pythona, nie wyświetli wyników w przeglądarce.

Aby uzyskać pełne działanie kodu, odwiedź stronę Jak wykonać skrypt w języku Python z php i wyświetlić dane wyjściowe w przeglądarce

Idealmind
źródło
Jak określić tutaj ścieżkę względną i bezwzględną. Zasadniczo mam mój skrypt Pythona obecny w folderze Let's say, tempmona ten sam folder zawiera mój skrypt Pythona. Chcę, aby aplikacja była przenośna, więc mogę po prostu skopiować tempmonfolder pod htdocs. To samo powinno działać na różnych maszynach.
Krishna Oza,
Doskonale działał. Możesz dodać otwierające i zamykające tagi php <? Php?> Dla lepszego zrozumienia dla początkujących
Zaheer
7

Robię takie rzeczy cały czas dla szybkich i brudnych skryptów. Dość często mamy skrypt CGI lub PHP, który po prostu używa system / popen do wywołania zewnętrznego programu.

Po prostu zachowaj szczególną ostrożność, jeśli Twój serwer sieciowy jest ogólnie otwarty na Internet. W takim przypadku należy wyczyścić dane wejściowe GET / POST, aby uniemożliwić atakującym wykonywanie dowolnych poleceń na komputerze.

Eli Courtwright
źródło
3

Twój plik call_python_file.php powinien wyglądać tak:

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

Spowoduje to wykonanie skryptu w języku Python i przesłanie wyniku do przeglądarki. Podczas gdy w skrypcie Pythona zmienna (sys.argv [1:]) będzie zawierać wszystkie argumenty. Aby wyświetlić argv jako ciąg znaków z dowolnego miejsca, z którego pobiera twój php, więc jeśli chcesz zrobić obszar tekstowy:

import sys

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

def main():
  print list1

if __name__ == '__main__':
    main()
Aze
źródło
0

Zwróć uwagę, że jeśli korzystasz ze środowiska wirtualnego (jak w hostingu współdzielonym), musisz dostosować ścieżkę do Pythona, np .: /home/user/mypython/bin/python ./cgi-bin/test.py

Bob3411
źródło
0

Powyższe metody wydają się być złożone. Użyj mojej metody jako odniesienia.

Mam te dwa pliki

run.php

mkdir.py

Tutaj utworzyłem stronę html, która zawiera przycisk GO. Za każdym razem, gdy naciśniesz ten przycisk, nowy folder zostanie utworzony w katalogu, do którego podałeś ścieżkę.

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
źródło
-2

Jeśli chcesz wykonać skrypt Pythona w PHP, musisz wykonać to polecenie w swoim skrypcie php:

exec('your script python.py')
Gouled Med
źródło
a) Spacje oddzielne parametry, czyli próbuje wywołać program yourz parametrami scripti python.py. b) O ile skrypt Pythona nie ma odpowiedniego shebang, należy wywołać interpreter Pythona i przekazać mu nazwę skryptu ( python script.py). Nawet z odpowiednim shebangiem jest to niewłaściwe, ponieważ wtedy dzwonisz, ./script.pyzamiast używać nazwiska tłumacza.
Tox