Doporučuji použít passthru
a přímé zpracování výstupní vyrovnávací paměti:
ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean();
Testováno na Ubuntu Server 10.04. Doufám, že vám to pomůže i na Arch Linuxu.
V PHP použijte funkci shell_exec:
Proveďte příkaz přes shell a vraťte celý výstup jako řetězec.
Vrátí výstup z provedeného příkazu nebo NULL, pokud dojde k chybě nebo příkaz neprodukuje žádný výstup.
<?php
$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;
?>
Do souboru Python test.py
, ověřte tento text na prvním řádku:(viz vysvětlení shebang):
#!/usr/bin/env python
Pokud máte nainstalovaných několik verzí Pythonu, /usr/bin/env zajistí, že použitý interpret je první na $PATH vašeho prostředí. Alternativou by bylo napevno zakódovat něco jako #!/usr/bin/python; to je v pořádku, ale méně flexibilní.
V Unixu může spustitelný soubor, který má být interpretován, indikovat, jaký interpret použít tím, že má znak #! na začátku prvního řádku, za ním následuje interpret (a případné potřebné příznaky).
Pokud mluvíte o jiných platformách, toto pravidlo samozřejmě neplatí (ale tato „řádka shebang“ neškodí a pomůže vám, pokud tento skript zkopírujete na platformu se základnou Unix, jako je Linux, Mac atd. ).
To platí, když jej spustíte v Unixu tak, že jej uděláte spustitelným (chmod +x myscript.py) a poté jej spustíte přímo:./myscript.py, spíše než jen python myscript.py
Chcete-li vytvořit spustitelný soubor na platformách typu unix:
chmod +x myscript.py
Také soubor Python musí mít správná oprávnění (spuštění pro uživatele www-data / apache, pokud PHP skript běží v prohlížeči nebo curl) a/nebo musí být "spustitelný". Také všechny příkazy do .py
soubor musí mít správná oprávnění.
Převzato z php manuálu:
Jen rychlé připomenutí pro ty, kteří se snaží použít shell_exec na platformě typu aunix a nezdá se, že by to fungovalo. PHP se v systému spouští jako webový uživatel (obecně www pro Apache), takže se musíte ujistit, že webový uživatel má práva k jakýmkoli souborům nebo adresářům, které se pokoušíte použít v příkazu shell_exec. Jinak se to nebude zdát dělat cokoli.
Pokud chcete znát návratový stav příkazu a získat celý stdout
výstup, který můžete ve skutečnosti použijte exec
:
$command = 'ls';
exec($command, $out, $status);
$out
je pole všech řádků. $status
je stav návratu. Velmi užitečné pro ladění.
Pokud chcete vidět také stderr
výstup můžete buď hrát s proc_open nebo jednoduše přidat 2>&1
na váš $command
. To druhé často stačí k tomu, aby věci fungovaly a mnohem rychleji je „implementovaly“.