简体   繁体   English

PHP脚本无法从Python脚本输出

[英]PHP script can't get output from Python script

I'm having an issue executing a Python script from a PHP script. 我在从PHP脚本执行Python脚本时遇到问题。 My client uses Bluehost, so I installed a third party module (numpy) for Python with the easy_install method described here: https://my.bluehost.com/cgi/help/530?step=530 我的客户端使用Bluehost,因此我使用此处描述的easy_install方法为Python安装了第三方模块(numpy): https ://my.bluehost.com/cgi/help/530?step = 530

To demonstrate my issue, I've created two python scripts and a PHP script. 为了演示我的问题,我创建了两个python脚本和一个PHP脚本。

hello.py contains: hello.py包含:

print "Hello, World!"

hello-numpy.py contains: hello-numpy.py包含:

import numpy
print "Hello, World!"

The PHP script contains: PHP脚本包含:

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'); ?>

I then get this output from PHP: 然后我从PHP获得此输出:

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

However, running these scripts from the SSH window yields the following results: 但是,从SSH窗口运行这些脚本会产生以下结果:

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

It seems PHP doesn't get any output when the Python script imports numpy, but it works fine from SSH. 当Python脚本导入numpy时,似乎PHP没有得到任何输出,但它可以在SSH中正常工作。 Furthermore, PHP gets a return status of 0 for hello.py but 1 for hello-numpy.py. 此外,PHP为hello.py返回0,但为hello-numpy.py返回1。 I thought it might be a permissions issue, but both PHP and SSH are running as the "venicetw" user. 我认为这可能是一个权限问题,但PHP和SSH都作为“venicetw”用户运行。 What would prevent PHP and Apache from getting the output from the Python script? 什么会阻止PHP和Apache从Python脚本获取输出? Is it something I can discuss with Bluehost, or something else I should check? 这是我可以与Bluehost讨论的东西,还是我应该检查的其他东西? We're using Apache 2.2.21 , PHP 5.2.17 , Python 2.4.3 , and numpy 1.6.0 . 我们使用的是Apache 2.2.21PHP 5.2.17Python 2.4.3numpy 1.6.0

Update: SSH prints the following Python paths: 更新: SSH打印以下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

But Apache only prints these Python paths: 但Apache只打印这些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

Solution: By executing /usr/bin/env from both PHP and SSH, I was able to determine that PHP was missing an environment variable for the Python path where numpy is installed. 解决方案:通过从PHP和SSH执行/ usr / bin / env,我能够确定PHP缺少安装numpy的Python路径的环境变量。 In this case, by adding 在这种情况下,通过添加

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

to the beginning of the PHP script, everything works as expected. 到PHP脚本的开头,一切都按预期工作。

If PHP gets a return status of 1, that indicates that the process you ran encountered an error. 如果PHP的返回状态为1,则表示您运行的进程遇到错误。 (An nonzero exit status usually indicates an error on Unix style systems. A couple programs are different, eg, diff .) Try examining the stderr produced by the subprocess to see what error messages are printed there. (非零退出状态通常表示Unix样式系统上存在错误。一些程序不同,例如diff 。)尝试检查子stderr生成的stderr ,以查看在那里打印的错误消息。

You can show stderr this way: 你可以用这种方式显示stderr

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

The 2>&1 instructs the shell to combine stderr and stdout into one stream. 2>&1指示shell将stderrstdout组合成一个流。 You normally don't want to do this, but it can make it easy to see the errors. 您通常不希望这样做,但它可以很容易地看到错误。

Update: Since the error you get is ImportError: No module named numpy we can try looking at Python's paths. 更新:因为你得到的错误是ImportError: No module named numpy我们可以尝试查看Python的路径。 It's possible that there are multiple Pythons installed on your system, and it's also possible that Apache's environment (root directory, etc) is different from the environment you get when you run Python over SSH. 您的系统上可能安装了多个Pythons,并且Apache的环境(根目录等)也可能与您通过SSH运行Python时获得的环境不同。 Try executing this Python script in both environments: 尝试在两种环境中执行此Python脚本:

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

One of those paths should point to where numpy is installed, and perhaps it is missing when you run it in Apache. 其中一条路径应指向安装numpy位置,并且在Apache中运行时可能会丢失它。 Or perhaps the Apache process has a different root directory, which would be inherited by the Python process. 或者Apache进程可能有一个不同的根目录,它将由Python进程继承。

Solution: Missing environment variable. 解决方案:缺少环境变量。 See comments. 看评论。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM