2012-01-02 42 views
6

Sto riscontrando un problema nell'esecuzione di uno script Python da uno script PHP. Il mio client usa Bluehost, quindi ho installato un modulo di terze parti (numpy) per Python con il metodo easy_install descritto qui: https://my.bluehost.com/cgi/help/530?step=530Lo script PHP non può essere emesso dallo script Python

Per dimostrare il mio problema, ho creato due script python e uno script PHP.

hello.py contiene:

print "Hello, World!" 

hello-numpy.py contiene:

import numpy 
print "Hello, World!" 

Lo script PHP contiene:

Output from exec('python hello.py'): <?php echo exec('python hello.py'); ?><br> 
Output from exec('python hello-numpy.py'): <?php echo exec('python hello-numpy.py'); ?><br> 
Output from exec('whoami'): <?php echo exec('whoami'); ?> 

Allora ottengo questo output da PHP:

Output from exec('python hello.py'): Hello, World!
Output from exec('python hello-numpy.py'):
Output from exec('whoami'): venicetw

Tuttavia, l'esecuzione di questi script dalla finestra SSH produce i seguenti risultati:

# python hello.py 
Hello, World! 
# python hello-numpy.py 
Hello, World! 
# whoami 
venicetw 

Sembra PHP non c'è niente di uscita quando le importazioni di script Python NumPy, ma funziona bene da SSH. Inoltre, PHP ottiene uno stato di ritorno di 0 per hello.py ma 1 per ciao-numpy.py. Ho pensato che potrebbe essere un problema di autorizzazioni, ma sia PHP che SSH sono in esecuzione come utente "venicetw". Cosa impedirebbe a PHP e Apache di ottenere l'output dallo script Python? È qualcosa che posso discutere con Bluehost, o qualcos'altro che dovrei controllare? Stiamo utilizzando Apache 2.2.21, PHP 5.2.17, Python 2.4.3 e numpy 1.6.0.

Aggiornamento: stampe SSH i seguenti percorsi Python:

/home8/venicetw/public_html/venicenoise/python 
/home8/venicetw/.local/lib/python2.4/site-packages/ogcserver-0.1.0-py2.4.egg 
/home8/venicetw/.local/lib/python2.4/site-packages/PIL-1.1.7-py2.4-linux-x86_64.egg 
/home8/venicetw/.local/lib/python2.4/site-packages/lxml-2.3.2-py2.4-linux-x86_64.egg 
/home8/venicetw/.local/lib/python2.4/site-packages/WebOb-1.2b2-py2.4.egg 
/home8/venicetw/.local/lib/python2.4/site-packages/PasteScript-1.7.5-py2.4.egg 
/home8/venicetw/.local/lib/python2.4/site-packages/PasteDeploy-1.5.0-py2.4.egg 
/home8/venicetw/.local/lib/python2.4/site-packages/Paste-1.7.5.1-py2.4.egg 
/home8/venicetw/.local/lib/python2.4/site-packages/numpy-1.6.0-py2.4-linux-x86_64.egg 
/home8/venicetw/.local/lib/python2.4/site-packages 
/home8/venicetw/.local/lib/python/site-packages 
/home8/venicetw/public_html/venicenoise/python 
/usr/lib64/python24.zip 
/usr/lib64/python2.4 
/usr/lib64/python2.4/plat-linux2 
/usr/lib64/python2.4/lib-tk 
/usr/lib64/python2.4/lib-dynload 
/usr/lib64/python2.4/site-packages 
/usr/lib64/python2.4/site-packages/Numeric 
/usr/lib64/python2.4/site-packages/PIL 
/usr/lib64/python2.4/site-packages/gtk-2.0 
/usr/lib/python2.4/site-packages 

Ma Apache stampa solo questi percorsi Python:

/home8/venicetw/public_html/venicenoise/python 
/usr/lib64/python24.zip 
/usr/lib64/python2.4 
/usr/lib64/python2.4/plat-linux2 
/usr/lib64/python2.4/lib-tk 
/usr/lib64/python2.4/lib-dynload 
/usr/lib64/python2.4/site-packages 
/usr/lib64/python2.4/site-packages/Numeric 
/usr/lib64/python2.4/site-packages/PIL 
/usr/lib64/python2.4/site-packages/gtk-2.0 
/usr/lib/python2.4/site-packages 

Soluzione: Eseguendo/usr/bin/env da sia PHP che SSH, sono stato in grado di determinare che PHP mancava una variabile d'ambiente per il percorso Python dove è installato numpy. In questo caso, con l'aggiunta di

putenv('PYTHONPATH=/home8/venicetw/.local/lib/python2.4/site-packages:/home8/venicetw/.local/lib/python/site-packages:'); 

all'inizio dello script PHP, tutto funziona come previsto.

risposta

5

Se PHP ottiene uno stato di ritorno pari a 1, ciò indica che il processo in esecuzione ha rilevato un errore. (Uno stato di uscita diverso da zero in genere indica un errore nei sistemi di stile Unix. Un paio di programmi sono diversi, ad esempio diff.) Prova ad esaminare lo stderr prodotto dal sottoprocesso per vedere quali messaggi di errore vengono stampati lì.

È possibile mostrare stderr questo modo:

Output from exec('python hello-numpy.py'): 
    <?php echo exec('python hello-numpy.py 2>&1'); ?><br> 

Il 2>&1 istruisce la shell di combinare stderr e stdout in un unico flusso. Normalmente non vuoi farlo, ma può rendere facile vedere gli errori.

Aggiornamento: Poiché l'errore che si ottiene è ImportError: No module named numpy, possiamo provare a guardare i percorsi di Python. È possibile che sul sistema siano installati più Python, ed è anche possibile che l'ambiente di Apache (directory root, ecc.) Sia diverso dall'ambiente che si ottiene quando si esegue Python su SSH. Prova l'esecuzione di questo script Python in entrambi gli ambienti:

import sys, os 
for path in sys.path: 
    print path 
print 
print 'Root:', os.readlink('/proc/self/root') # Linux only 

Uno di questi percorsi dovrebbe puntare a dove è installato numpy, e forse non è presente quando lo si esegue in Apache. O forse il processo Apache ha una directory root diversa, che sarebbe ereditata dal processo Python.

Soluzione: Variabile di ambiente mancante. Vedi i commenti.

+0

Ah, ha ottenuto: "ImportError: nessun modulo denominato numpy" Mi chiedo se si tratta solo di riavviare Apache? –

+0

Assicurati di accedere entrambe alla stessa versione di Python. –

+0

Appena controllato - entrambi stanno accedendo a Python 2.4.3. E trovandosi in un ambiente di hosting condiviso, il riavvio di Apache non è un'opzione. –

Problemi correlati