2013-06-28 58 views
0

当我打电话这条巨蟒文件不再返回给PHP:输出包括pyCuda

import sys 
if __name__ == "__main__": 
    print sys.argv[1] 

从PHP这样的:

$param = "hello"; 
$result = shell_exec("python /path/to/python/file.py " . $param); 
echo $result; 

运行时,为显示你好伟大的工程PHP文件。但是,当我将pyCuda(2012.1)导入python文件时,即使从bash运行命令时仍然显示输出,它也不会返回到PHP。这与pyCuda蟒蛇文件导入:

from pycuda import driver as drv 
from pycuda import tools 
from pycuda import autoinit 
import sys 
if __name__ == "__main__": 
    print sys.argv[1] 

PHP为什么不再接收输出时pyCuda是进口的,什么是阅读从PHP这条巨蟒文件输出的最好方法?

非常感谢!

+0

你是从一个网络服务器运行这个?也许这些导入会导致一些错误,并且错误消息将会变为stderr(并因此导致服务器日志)而不是stdout。看看你的服务器日志,或尝试追加'2>&1'到你的命令。 – mata

+0

是的,我在网络服务器上运行这个。我检查了日志,但没有报告错误。 python文件似乎工作正常,因为它直接在shell中运行时返回响应,而不是通过shell_exec从PHP中运行。 – SoftForge

+0

网络服务器进程通常以不同的用户身份运行,而不同的用户通常拥有非常有限的权限,所以它与从shell运行它不一样。我对cuda没有太多经验,但我可以想象一个用户想要使用它至少需要在'video'组中才能访问'/ dev/nvidia *'的东西。 – mata

回答

1

pycuda.autoinit注册一个atexit自动处理程序来清理它创建的CUDA上下文,以便Python代码正常退出。很可能这是在不刷新标准输出的情况下终止应用程序,所以输出永远不会被发射。

因此,无论尝试标准输出的显式冲洗:

import sys 
print sys.argv[1] 
sys.stdout.flush() 

或不使用pycuda.autoinit和处理设置,把自己的驱动程序API方面的下降。

+0

感谢您的建议,但添加** sys.stdout.flush()**并没有任何不同。我已经将pycuda导入驱动程序中的导入减少为drv **,它仍然停止输出到PHP。 – SoftForge