0

当从 Android 发出 GET HTTP 请求时,尝试从 php 调用 python (2.6) 脚本,但如果 import numpy 在我的脚本中,我会失败,如果我将其删除,则脚本/调用有效。我正在计算 MySQL 中数字字段的 FFT 谱,所以我需要 numpy(或者我需要吗?)。

我看过关于 SO 的类似问题, @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,所以这对我没有太大帮助,你觉得呢?

4

1 回答 1

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)

于 2012-12-18T08:40:30.187 回答