簡體   English   中英

從PHP腳本調用python腳本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM