1. 程式人生 > 其它 >php laravel 控制器controller 呼叫 python 的一些問題

php laravel 控制器controller 呼叫 python 的一些問題

技術標籤:PythonPhp 程式設計pythonphplaravel

最近有個專案要用php 呼叫python 來執行一些實時採集功能
以前這個專案是穩定執行的,時隔半年後,對方資料來源 over 掉了要換資料來源。
結果換完後,死活不執行了。
debug 一天一夜後,linux 上命令列執行妥妥的。。。。。
寫進 controller ?oh shit! 能看到返回 串,卻看不到結果??

都快整哭我了,後面沉著一口氣,決定 step debug
一步一步debug過去,看問題在哪。

終於30個小時後,我想了一下,會不會是呼叫的時候有錯誤?
於時,查資料,發現可以呈現 php 呼叫 python 後出現的錯誤

難怪我一直找不到原因,妹的,我的呼叫方式,是隻能顯示返回串,不顯示錯誤。
事實上正確的呼叫要如下所示

exec("python3 pytest/space.py {$num1} {$num2} 2>&1",$out,$status);//如果你是python3的執行環境就用這句

就是 2>&1 這句不能少。一定要寫進去。
這樣,一執行,一呼叫。
果然出錯誤資訊了:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 8-11: ordinal not in range
(128)

查閱資料發現:
當字串裡有 \n、\t、\r時,json.loads()失效,異常,要去掉;
而我的python 檔案裡。因為要監控步驟,有比較多的print 語句。
所以,會有輸出,如果要輸出的情況之下
**json.loads()**必然失效,導致python程式無法獲取到採集地址。
因為python是首先去獲取資料來源地址,再去採集。

解決問題的辦法非常簡單。

將這個python程式,全部 print 語句註釋掉

完美!收工!

僅在此記錄一下,省得下次又debug 一天一夜搞不定。

附php laravel 控制器呼叫python方法:

    public function
opentest($cty,$lbl) { $python="python3"; $ai="open/test.py"; $cmd=$python." ".$ai." ".$cty." ".$lbl." 2>&1"; $out=null; $res=null; exec($cmd,$out,$res); //dd($out); return $out; }

$cty 和 $lbl 表示輸入給python的引數
$ai 表示你呼叫的路徑,是相對於 laravel 的 public 路徑而言。
即 …/public/open/test.py

$out是指返回的成功或者錯誤資訊
$res是指呼叫返回結果,通常是1