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.
Ah, ha ottenuto: "ImportError: nessun modulo denominato numpy" Mi chiedo se si tratta solo di riavviare Apache? –
Assicurati di accedere entrambe alla stessa versione di Python. –
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. –