Consiglio di utilizzare passthru
e gestire direttamente il buffer di output:
ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean();
Testato su Ubuntu Server 10.04. Spero che ti sia d'aiuto anche su Arch Linux.
In PHP usa la funzione shell_exec:
Esegue il comando tramite shell e restituisce l'output completo come stringa.
Restituisce l'output dal comando eseguito o NULL se si è verificato un errore o il comando non produce alcun output.
<?php
$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;
?>
Nel file Python test.py
, verifica questo testo nella prima riga:(vedi spiegazione shebang):
#!/usr/bin/env python
Se hai installato diverse versioni di Python, /usr/bin/env assicurerà che l'interprete utilizzato sia il primo nel $PATH del tuo ambiente. L'alternativa sarebbe codificare qualcosa come #!/usr/bin/python; va bene, ma meno flessibile.
In Unix, un file eseguibile che deve essere interpretato può indicare quale interprete usare avendo un #! all'inizio della prima riga, seguito dall'interprete (e da eventuali flag necessari).
Se stai parlando di altre piattaforme, ovviamente, questa regola non si applica (ma quella "linea shebang" non fa male e ti aiuterà se copi quello script su una piattaforma con una base Unix, come Linux, Mac, ecc. ).
Questo vale quando lo esegui in Unix rendendolo eseguibile (chmod +x myscript.py) e poi eseguendolo direttamente:./myscript.py,piuttosto che solo python myscript.py
Per rendere eseguibile un file su piattaforme di tipo unix:
chmod +x myscript.py
Anche il file Python deve avere i privilegi corretti (esecuzione per l'utente www-data / apache se lo script PHP viene eseguito nel browser o curl) e/o deve essere "eseguibile". Anche tutti i comandi in .py
il file deve disporre dei privilegi corretti.
Tratto dal manuale php:
Solo un rapido promemoria per coloro che cercano di utilizzare shell_exec su una piattaforma di tipo aunix e non riescono a farlo funzionare. PHP viene eseguito come utente Web sul sistema (generalmente www per Apache), quindi è necessario assicurarsi che l'utente Web abbia i diritti su qualsiasi file o directory che si sta tentando di utilizzare nel comando shell_exec. In caso contrario, non sembrerà fare qualsiasi cosa.
Se vuoi conoscere lo stato di ritorno del comando e ottenere l'intero stdout
output che puoi effettivamente usa exec
:
$command = 'ls';
exec($command, $out, $status);
$out
è un array di tutte le righe. $status
è lo stato di ritorno. Molto utile per il debug.
Se vuoi vedere anche il stderr
output puoi giocare con proc_open o semplicemente aggiungere 2>&1
al tuo $command
. Quest'ultimo è spesso sufficiente per far funzionare le cose e molto più velocemente da "implementare".