首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP脚本无法从Python脚本获得输出

问PHP脚本无法从Python脚本获得输出
EN

Stack Overflow用户
提问于 2012-01-02 19:19:10
回答 1查看 9.4K关注 0票数 6

我在从PHP脚本执行Python脚本时遇到了问题。我的客户端使用Bluehost,所以我用这里描述的easy_install方法安装了一个第三方模块(numpy):https://my.bluehost.com/cgi/help/530?step=530

为了演示我的问题,我创建了两个python脚本和一个PHP脚本。

hello.py包含:

代码语言:javascript
复制
print "Hello, World!"

hello-numpy.py包含:

代码语言:javascript
复制
import numpy
print "Hello, World!"

PHP脚本包含:

代码语言:javascript
复制
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'); ?>

然后,我从PHP获得这个输出:

来自exec的

输出(‘python hello.py'):你好,世界!

来自exec的输出(‘python hello-numpy.py'):

来自exec(“whoami”)的输出: venicetw

但是,从SSH窗口运行这些脚本将产生以下结果:

代码语言:javascript
复制
# python hello.py
Hello, World!
# python hello-numpy.py
Hello, World!
# whoami
venicetw

当Python脚本导入numpy时,PHP似乎没有得到任何输出,但是它从SSH中运行得很好。此外,hello.py的返回状态为0,hello-numpy.py的返回状态为1。我认为这可能是一个权限问题,但PHP和SSH都是作为"venicetw“用户运行的。什么会阻止PHP和Apache从Python脚本获得输出?这是我可以和Bluehost讨论的事情,还是其他我应该检查的东西?我们使用的是Apache 2.2.21、PHP 5.2.17、Python 2.4.3和numpy 1.6.0。

更新: SSH打印以下路径:

代码语言:javascript
复制
/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

但是Apache只输出这些Python路径:

代码语言:javascript
复制
/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

解决方案:通过从和SSH执行/usr/bin/env,我能够确定缺少安装numpy的Python的一个环境变量。在本例中,通过添加

代码语言:javascript
复制
putenv('PYTHONPATH=/home8/venicetw/.local/lib/python2.4/site-packages:/home8/venicetw/.local/lib/python/site-packages:');

到PHP脚本的开头,一切都如预期的那样工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-02 19:20:48

如果PHP的返回状态为1,则表示您运行的进程遇到了错误。(非零退出状态通常表示Unix样式系统上的错误。几个程序是不同的,例如,diff。)试着检查子进程生成的stderr,看看在那里输出了哪些错误消息。

您可以这样向stderr展示:

代码语言:javascript
复制
Output from exec('python hello-numpy.py'):
    <?php echo exec('python hello-numpy.py 2>&1'); ?><br>

2>&1指示shell将stderr和stdout组合成一个流。您通常不想这样做,但它可以使您很容易看到错误。

更新:,因为您得到的错误是ImportError: No module named numpy,所以我们可以尝试查看ImportError: No module named numpy的路径。您的系统上可能安装了多个Pythons,而且Apache的环境(根目录等)也可能与您在SSH上运行Python时得到的环境不同。尝试在这两种环境中执行这个Python脚本:

代码语言:javascript
复制
import sys, os
for path in sys.path:
    print path
print
print 'Root:', os.readlink('/proc/self/root') # Linux only

其中一条路径应该指向安装numpy的位置,并且在Apache中运行它时可能会丢失它。或者Apache进程有一个不同的根目录,它将由Python进程继承。

解决方案:缺少环境变量。见评论。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8704519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档