PHP script cannot get output from Python script

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.

+6
source share
1 answer

If PHP receives a return status of 1, this indicates that the process you encountered encountered an error. (A non-zero exit status usually indicates an error on Unix-style systems. A couple of programs are different, such as diff .) Try examining the stderr created by the subprocess to see which error messages are printed there.

You can show stderr as follows:

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

2>&1 tells the shell to combine stderr and stdout into one stream. Usually you do not want to do this, but it can make it easier to view errors.

Update: Since the error you are getting is ImportError: No module named numpy , we can try to find Python paths. It is possible that several Pythons are installed on your system, and it is also possible that the Apache environment (root directory, etc.) is different from the environment that you get when you start Python through SSH. Try running this Python script in both environments:

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

One of these paths should indicate where numpy installed, and it may not be present when launched in Apache. Or perhaps the Apache process has a different root directory that will be inherited by the Python process.

Solution: Missing environment variable. See Comments.

+5
source

Source: https://habr.com/ru/post/904935/


All Articles