我从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
。
更新: 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
子进程产生的错误,看看那里打印了什么错误消息。
您可以这样显示stderr
:
Output from exec('python hello-numpy.py'):
<?php echo exec('python hello-numpy.py 2>&1'); ?><br>
该2>&1
指示外壳相结合stderr
,并stdout
为一个流。您通常不想这样做,但是可以很容易地看到错误。
更新: 由于您得到的错误是ImportError: No module named numpy
我们可以尝试查看Python的路径。您的系统上可能安装了多个Python,Apache的环境(根目录等)也可能不同于通过SSH运行Python时所获得的环境。尝试在两种环境中执行此Python脚本:
import sys, os
for path in sys.path:
print path
print
print 'Root:', os.readlink('/proc/self/root') # Linux only
这些路径之一应指向numpy
安装位置,并且在Apache中运行它时可能会丢失。或者,Apache进程具有不同的根目录,该根目录将由Python进程继承。
解决方案: 缺少环境变量。看评论。
我想在macos上使用apache2从PHP文件执行Python脚本。我能够执行简单的python脚本,如: 从PHP: 巨蟒 输出是: 但当我尝试导入以下包时: 我得到: 我的问题是,有人知道: 1–我如何使这些(以及任何其他)软件包工作? 2–shell_exec当前正在执行python2。如何添加Python 3?(如果我编写python3而不是python将无法工作)
问题内容: 我有一个简单的PHP函数,该函数应在调用时执行Pyton脚本。我已经在我的php程序中多次尝试了这种功能,但是这次以某种方式该功能根本不执行python脚本。当我从命令提示符下访问脚本并运行时,它将成功执行。我要提到的一件事是,该脚本具有python的NLTK库的一些认真实现,并且执行和执行其操作(即数据处理并存储到db)需要20秒钟以上。执行延迟是否会导致此问题,或者这次我还缺少其他
问题内容: 我正在Raspberry Pi上的Apache服务器上运行PHP文档,并且希望它在单击按钮时运行文件。我在命令下放置了一些echo命令,以使文件运行,并且该文件可以打印出来,但文件无法运行。index.php文件和lightson.py和lightsoff.py文件都在同一目录( / var / www )中,我在这两个文件的顶部都添加了 #!/ usr / bin / env pyt
问题内容: 我在树莓派上有一个带有2个按钮(打开和关闭)的PHP网页,“打开”按钮重定向到On.php,“关闭”按钮重定向到Off.php在“ / usr / lib / cgi-bin”中,我有一个python脚本我想执行(script.py),我可以通过在终端上键入以下内容来完美地执行它 如果我从终端执行此操作,它将起作用。 问题是我的“ / var / www”文件夹中的PHP文件(On.p
问题内容: 我想从PHP运行Python脚本。该脚本的语法很好,当我从命令行运行它时,它会在它旁边生成一个图像文件。当我从命令行运行PHP文件(包含Python exec)时,它将生成一个图像文件。很好。问题是:当我使用浏览器并运行PHP时,它不会生成任何图像文件。我使用的是Xubuntu OS。 问题答案: 问题是matplotlib后端设置。我更改为“ Agg”,并且plot函数正常运行。
您好,我正在尝试在apache2服务器上运行Raspberry Pi,使用PHP中的pyautogui库执行Python脚本。从命令行执行Python脚本时,我没有遇到任何问题,但通过PHP的“shell_exec”执行时,我收到以下错误消息: 错误登录apache2: 回溯(最近一次调用):文件“/home/pi/Projects/Python/wakeUp.py”,第2行,在导入pyautog