2013-11-01 14 views
63

Sto cercando di eseguire uno script Python da PHP utilizzando il seguente comando:esecuzione di uno script Python da PHP

exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');

Tuttavia, PHP semplicemente non produce alcun output. La segnalazione degli errori è impostata su E_ALL e display_errors è attivo.

Ecco che cosa ho provato:

  • ho usato python2, /usr/bin/python2 e python2.7 invece di /usr/bin/python2.7
  • ho usato anche un percorso relativo al posto di un percorso assoluto che non ha modificato nulla.
  • Ho provato a utilizzare i comandi exec, shell_exec, system.

Tuttavia, se corro

if (exec('echo TEST') == 'TEST') 
{ 
    echo 'exec works!'; 
} 

funziona perfettamente bene mentre shutdown now non fa nulla.

PHP ha le autorizzazioni per accedere ed eseguire il file.

EDIT: Grazie ad Alejandro, sono stato in grado di risolvere il problema. Se hai lo stesso problema, non dimenticare che il tuo server web probabilmente/si spera non venga eseguito come root. Provare ad accedere come utente del server web o utente con autorizzazioni simili e provare a eseguire i comandi da soli.

risposta

98

Testato su Ubuntu Server 10.04. Spero che ti aiuti anche su Arch Linux.

In PHP:

<?php 

$command = escapeshellcmd('/usr/custom/test.py'); 
$output = shell_exec($command); 
echo $output; 

?> 

In File Python test.py, verificare questo testo in prima linea: (see shebang explain):

#!/usr/bin/env python 

anche Python presentare should have correct privileges (esecuzione per l'utente www-data/apache se PHP lo script viene eseguito nel browser o tramite arricciatura) e/o deve essere "eseguibile". Anche tutti i comandi nel file .py devono avere i privilegi corretti.

chmod +x myscript.py 
+6

Grazie, ha fatto il trucco! C'era un altro problema: l'utente Apache non era in grado di eseguire un comando nello script Python ma ero in grado di risolverlo usando sudo e aggiungendo un'eccezione per il mio script al file sudoers. Grazie ancora! :) –

+0

Sto affrontando lo stesso problema dell'utente di apache, puoi guidarmi per favore? – Emma

+1

ho usato la tua risposta, esegue lo script python bene ma non riesco a echeggiare i risultati non compaiono nella pagina web, puoi aiutarmi. –

13

mi consiglia di utilizzare passthru e la gestione del buffer di uscita direttamente:

ob_start(); 
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2'); 
$output = ob_get_clean(); 
7

Alejandro inchiodato, aggiungendo un chiarimento al l'eccezione (Ubuntu o Debian) - non ho il rappresentante di aggiungere la risposta in sé:

sudoers di file: sudo visudo

eccezione aggiunto: www-data ALL=(ALL) NOPASSWD: ALL

+5

Non sembra efficace aggiungere www-data a sudoers e dare ad apache più autorizzazioni di cui ha bisogno. Fornire i permessi di www-data sullo script che si sta eseguendo sarebbe sufficiente. – JasonRDalton

8

Se si desidera conoscere lo stato di ritorno del comando e ottenere l'intero stdout uscita si possibile effettivamente utilizzare exec:

$command = 'ls'; 
exec($command, $out, $status); 

$out è un array di tutte le linee. $status è lo stato di ritorno. Molto utile per il debug.

Se anche voi volete vedere l'output stderr è possibile giocare sia con proc_open o semplicemente aggiungere al vostro 2>&1$command. Quest'ultimo è spesso sufficiente per far funzionare le cose e molto più velocemente per "implementare".

0

Nel mio caso, era necessario creare una nuova cartella nella directory www denominata scripts. Entro scripts ho aggiunto un nuovo file chiamato test.py.

Ho quindi utilizzato sudo chown www-data:root scripts e sudo chown www-data:root test.py.

Quindi sono passato alla nuova directory scripts e utilizzato sudo chmod +x test.py.

Il mio file test.py sembra così. Si noti la diversa versione di Python:

#!/usr/bin/env python3.5 
print("Hello World!") 

da PHP io ora fare questo:

$message = exec("/var/www/scripts/test.py 2>&1"); 
print_r($message); 

e si dovrebbe vedere: Ciao Mondo!