我从PHP脚本执行Python脚本时遇到问题。我的客户端使用Bluehost,因此我使用在此描述的easy_install方法为Python安装了第三方模块(numpy):https ://my.bluehost.com/cgi/help/530?step = 530
为了演示我的问题,我创建了两个python脚本和一个PHP脚本。
hello.py包含:
print "Hello, World!"
hello-numpy.py包含:
import numpy print "Hello, World!"
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'); ?>
然后,我从PHP获得以下输出:
exec(’python hello.py’)的输出:世界,您好! exec(’python hello-numpy.py’)的 输出:exec(’whoami’)的输出:venicetw
但是,从SSH窗口运行这些脚本会产生以下结果:
# python hello.py Hello, World! # python hello-numpy.py Hello, World! # whoami venicetw
当Python脚本导入numpy时,PHP似乎没有任何输出,但是从SSH可以正常工作。此外,PHP的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。
Apache 2.2.21
PHP 5.2.17
Python 2.4.3
numpy 1.6.0
更新: 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
但是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
解决方案: 通过从PHP和SSH执行/ usr / bin / env,我能够确定PHP缺少安装numpy的Python路径的环境变量。在这种情况下,通过添加
putenv('PYTHONPATH=/home8/venicetw/.local/lib/python2.4/site-packages:/home8/venicetw/.local/lib/python/site-packages:');
到PHP脚本的开始,一切都按预期工作。
如果PHP的返回状态为1,则表明您运行的进程遇到错误。(非零退出状态 通常 表示Unix风格的系统上有错误。几个程序不同,例如diff。)尝试检查stderr子进程产生的错误,看看那里打印了什么错误消息。
diff
stderr
您可以这样显示stderr:
Output from exec('python hello-numpy.py'): <?php echo exec('python hello-numpy.py 2>&1'); ?><br>
该2>&1指示外壳相结合stderr,并stdout为一个流。您通常不想这样做,但是可以很容易地看到错误。
2>&1
stdout
更新: 由于您得到的错误是ImportError: No module named numpy我们可以尝试查看Python的路径。您的系统上可能安装了多个Python,Apache的环境(根目录等)也可能不同于通过SSH运行Python时所获得的环境。尝试在两种环境中执行此Python脚本:
ImportError: No module named numpy
import sys, os for path in sys.path: print path print print 'Root:', os.readlink('/proc/self/root') # Linux only
这些路径之一应指向numpy安装位置,并且在Apache中运行它时可能会丢失。或者,Apache进程具有不同的根目录,该根目录将由Python进程继承。
numpy
解决方案: 缺少环境变量。看评论。