Próbuję uruchomić skrypt w Pythonie z PHP za pomocą następującego polecenia:
exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
Jednak PHP po prostu nie generuje żadnych danych wyjściowych. Raportowanie błędów jest ustawione na E_ALL, a display_errors jest włączone.
Oto, czego próbowałem:
- Kiedyś
python2
,/usr/bin/python2
apython2.7
zamiast/usr/bin/python2.7
- Użyłem również ścieżki względnej zamiast ścieżki bezwzględnej, która również niczego nie zmienia.
- Próbowałem za pomocą komendy
exec
,shell_exec
,system
.
Jeśli jednak biegnę
if (exec('echo TEST') == 'TEST')
{
echo 'exec works!';
}
działa doskonale, ale shutdown now
nic nie robi.
PHP ma uprawnienia dostępu i wykonywania pliku.
EDYCJA: Dzięki Alejandro udało mi się naprawić problem. Jeśli masz ten sam problem, nie zapominaj, że twój serwer WWW prawdopodobnie / miejmy nadzieję nie działa jako root. Spróbuj zalogować się jako użytkownik serwera WWW lub użytkownik z podobnymi uprawnieniami i spróbuj samodzielnie uruchomić polecenia.
Odpowiedzi:
Testowane na Ubuntu Server 10.04. Mam nadzieję, że pomoże ci to również w Arch Linux.
W PHP użyj funkcji shell_exec :
W pliku Pythona
test.py
sprawdź ten tekst w pierwszej linii: (zobacz wyjaśnienie shebang) :Również plik Pythona musi mieć odpowiednie uprawnienia (wykonanie dla użytkownika www-data / apache, jeśli skrypt PHP działa w przeglądarce lub curl) i / lub musi być „wykonywalny”. Również wszystkie komendy do
.py
pliku muszą mieć odpowiednie uprawnienia:Zaczerpnięte z podręcznika PHP :
Aby uczynić plik wykonywalny na platformach typu unix :
źródło
echo shell_exec("/usr/local/bin/python3 /Users/cyborg/Dev/magic.py");
lub:echo shell_exec("/usr/bin/python /Users/cyborg/Dev/magic.py");
Zalecam bezpośrednie używanie
passthru
i obsługę bufora wyjściowego:źródło
Jeśli chcesz poznać stan powrotu polecenia i uzyskać wszystkie
stdout
dane wyjściowe, możesz użyćexec
:$out
jest tablicą wszystkich linii.$status
to status zwrotu. Bardzo przydatne do debugowania.Jeśli chcesz również zobaczyć
stderr
wyjście, możesz albo pobawić się proc_open, albo po prostu dodać2>&1
do swojego$command
. To ostatnie często wystarcza, aby wszystko działało i znacznie szybciej je „wdrożyło”.źródło
Alejandro załatwił to, dodając wyjaśnienie do wyjątku (Ubuntu lub Debian) - nie mam przedstawiciela, który mógłby dodać do samej odpowiedzi:
plik sudoers:
sudo visudo
dodano wyjątek:
www-data ALL=(ALL) NOPASSWD: ALL
źródło
Aby wyjaśnić, którego polecenia użyć w zależności od sytuacji
exec()
- Uruchom program zewnętrznysystem()
- Uruchom program zewnętrzny i wyświetl dane wyjściowepassthru()
- Uruchom program zewnętrzny i wyświetl nieprzetworzone dane wyjścioweŹródło: http://php.net/manual/en/function.exec.php
źródło
W moim przypadku musiałem utworzyć nowy folder w
www
katalogu o nazwiescripts
. W ramachscripts
dodałem nowy plik o nazwietest.py
.Następnie użyłem
sudo chown www-data:root scripts
isudo chown www-data:root test.py
.Potem poszedłem do nowego
scripts
katalogu i użyłemsudo chmod +x test.py
.Mój plik test.py wygląda tak. Zwróć uwagę na inną wersję Pythona:
Z php teraz robię to:
Powinieneś zobaczyć: Hello World!
źródło
Powyższe metody wydają się skomplikowane. Użyj mojej metody jako odniesienia.
Mam te dwa pliki:
run.php
mkdir.py
Tutaj utworzyłem stronę HTML, która zawiera GOprzycisk. Za każdym razem, gdy naciśniesz ten przycisk, nowy folder zostanie utworzony w katalogu, do którego podałeś ścieżkę.
run.php
mkdir.py
źródło
To takie trywialne, ale chciałem tylko pomóc każdemu, kto już zastosował się do sugestii Alejandro, ale napotkał ten błąd:
Jeśli ktoś napotkał ten błąd, musi wprowadzić małą zmianę w pliku php autorstwa Alejandro:
źródło
Zainspirowany Alejandro Quirozem:
Musisz dodać Python i nie potrzebujesz ścieżki.
źródło