[英]call python script from PHP script
我需要從PHP腳本調用python腳本,然后將結果返回給PHP。 我在玩proc_open
函數。 但這行不通。 你知道為什么嗎? 這是PHP腳本:
$msg = "this is a new message \n bla ble !@#$%^&*%(*))(_+=-";
$descriptorspec = array(
0 => array("pipe","r"),
1 => array("pipe","w"),
2 => array("file","./error.log","a")
) ;
$cwd = './' ;
$command = 'python ./upper.py ';
$proc = proc_open($command, $descriptorspec, $pipes, $cwd) ;
if ( is_resource( $proc ) ) {
fwrite( $pipes[0], $msg );
fclose( $pipes[0] );
fclose( $pipes[1] );
proc_close($proc);
echo "proc is closed\n";
}
else {
echo 'proc is not a resource';
}
python`upper.py'腳本
import sys
print 'in python script'
data = sys.stdin.readlines()
print data
輸出為:
in php script
proc is closed
我在error.log中有錯誤:
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
以防萬一答案仍然對任何人都重要:
發生錯誤是因為在python腳本有機會編寫$pipes[1]
之前立即關閉它,而且很有可能甚至在它甚至開始運行之前就將其關閉。 我的系統(蘋果機)上的錯誤是:
close failed: [Errno 32] Broken pipe
(出於好奇,您運行的是哪種類型的系統會給您帶來奇怪的信息?)
無論如何,您可以通過在關閉管道之前讀取管道來避免錯誤,例如,
stream_get_contents($pipes[1]);
這樣可以確保在管道仍處於打開狀態時,python腳本有機會編寫管道(至少一次)。
如果您是python腳本的作者,那么除非您的PHP腳本要讀取其編寫的內容,否則讓它編寫輸出沒有什么意義。
在另一方面,如果Python腳本是你制作的不是,並把它寫到你不在乎輸出,你可能能夠避免玩一些游戲與讀取輸出pcntl_wait()
或pcntl_waitpid()
- -雖然我不敢打賭。 一個更安全的選擇可能是只讀取輸出流並將它們放在地板上。
(種類繁多的問題引發了一個有趣的問題,即您是否關心輸出:如果您不知道先驗 ,輸出的結束會是什么樣子,並且子proc_close()
在關閉管道並調用proc_close()
之前不會退出。 proc_close()
,您如何知道子流程實際上何時完成了您所稱的工作?)
另一個選擇(到目前為止,我還沒有研究過)可能是將不需要的任何輸出流連接到一個描述符,例如:
array("file", "/dev/null", "w")
或系統上與/dev/null
等價的任何東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.