导入numpy时,从php调用python失败

时间:2012-11-04 21:43:58

标签: php python numpy

当从Android发出GET HTTP请求时,尝试从php调用python(2.6)脚本,但如果导入numpy在我的脚本中,则会出现故障,如果我将其删除,脚本/调用将起作用。我正在计算MySQL中数字字段的FFT频谱,所以我需要numpy(或者我呢?)。

我在SO上看到了类似的问题,this一个,@ dietrich-epp回答,是最好的,但是当我尝试相同的建议时,我的脚本仍然失败。

这是我的python脚本的导入部分:

import  os, os.path, sys
import numpy
import string
import math
import MySQLdb

我的PHP文件的开头:

<?php
putenv('PYTHONPATH=/usr/lib/python2.6/site-packages:');
...

这就是我如何调用我的python脚本:

$command = "/var/www/html/tremcam/tst0.py localhost baseline@nd.edu 2>&1";
$pid = popen( $command,"r");
while( !feof( $pid ) )
{
 #echo fread($pid, 256);
 print(json_encode(fread($pid, 256)));
 flush();
 ob_flush();
 usleep(100000);
}
pclose($pid);

我的环境变量将PYTHONPATH设置为:

/var/www/html/tremcam/pythons
/usr/lib/python2.6/site-packages
/usr/lib
/usr/lib/python26.zip
/usr/lib/python2.6
/usr/lib/python2.6/plat-linux2
/usr/lib/python2.6/lib-tk
/usr/lib/python2.6/lib-old
/usr/lib/python2.6/lib-dynload
/usr/lib/python2.6/site-packages/gtk-2.0
/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info
/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info

这个(PYTHONPATH=/usr/lib/python2.6/site-packages)应该指向/usr/lib/python2.6/site-packages/numpy吗?

我将尝试使用passthru()而不是我目前在PHP中使用它的方式。请注意,在我能够将numpy导入为np之后,代码将需要几秒钟才能完成,这也是一个问题吗?

更新:如果我使用:passthru('/var/www/html/tremcam/tst0.py localhost baseline@nd.edu 2>&1',$result);

我得到退出状态码139,这对我没有多大帮助,您怎么看?

1 个答案:

答案 0 :(得分:2)

试试 setsebool httpd_tmp_exec on 如果它的工作原理使其永久化 setsebool -P httpd_tmp_exec on

应该是SELinux否认Apache你的pytonpath目录(是的,你应该提供非常numpy的文件夹,如果它仍然不起作用,但它根本不需要)。

稍微不那么干净的方法是在import ctypeslib

中对此行/<your numpy path>/numpy/__init__.py进行评论

我遇到了同样的问题,两种方法都运行良好(后者虽然可能会导致后期开发中出现一些不一致,因此我建议您先尝试使用setsebool)