I had a problem running a Python script from a PHP script. My client uses Bluehost, so I installed a third-party module (numpy) for Python using the easy_install method described here: https://my.bluehost.com/cgi/help/530?step=530
To demonstrate my problem, I created two python scripts and a PHP script.
hello.py contains:
print "Hello, World!"
hello-numpy.py contains:
import numpy print "Hello, World!"
PHP script contains:
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'); ?>
Then I get this output from PHP:
Output from exec ('python hello.py'): Hello, World!
Output from exec ('python hello-numpy.py'):
Exit exec ('whoami'): venicetw
However, running these scripts from an SSH window gives the following results:
# python hello.py Hello, World! # python hello-numpy.py Hello, World! # whoami venicetw
PHP doesn't seem to get any output when the Python script imports numpy, but it works fine with SSH. In addition, PHP receives a return status of 0 for hello.py, but 1 for hello-numpy.py. I thought this might be a permission issue, but both PHP and SSH work as the user of "venicetw". What would prevent PHP and Apache from getting output from a Python script? Is this something I can discuss with Bluehost, or is there something else I should check? We use Apache 2.2.21 , PHP 5.2.17 , Python 2.4.3 and numpy 1.6.0 .
Update: SSH prints the following Python paths:
/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
But Apache only prints these Python paths:
/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
Solution: By running / usr / bin / env with both PHP and SSH, I was able to determine that PHP does not have an environment variable for the Python path where numpy is installed. In this case, adding
putenv('PYTHONPATH=/home8/venicetw/.local/lib/python2.4/site-packages:/home8/venicetw/.local/lib/python/site-packages:');
To the top of the PHP script, everything works as expected.