2013-06-28 60 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