Laravel php使用exec()調用python腳本進行交互
一、準備工作:
- 準備一個等交互的test.py(python的文件名大家自定義,我這裏就叫test.py)的python文件。
- 在laravel框架中創建一個php控制器和編寫訪問該控制器的路由。
- 將test.py文件放在laravel 框架中的 public 目錄下。
二、開始測試:
- php代碼示例:
<?php
namespace App\Http\Controllers\V1_2;
use App\Models\Collection;
class Test extends Controller
{
public function testA(){
// exec('python3 /root/space/space.py aaa bbb 2>&1',$out,$status);//標準寫法
$num1 = 5;//傳遞給python的參數1
$num2 = 3;//傳遞給python的參數2
//exec('python pytest/space.py 2>&1',$out,$status);//如果你是python2的運行環境就用這句。
//我的python文件位置在laravel框架中的.\publi\pytest\space.py;
#這裏注意在‘python3 pytest/space.py 2>&1’ 的結尾 “2>&1” 沒有這句話,打印的時候你是看不到報錯的!!!
#將2和重定向 到1可以使用:2>&1 用來打印數據或錯誤信息。
exec("python3 pytest/space.py {$num1} {$num2} 2>&1",$out,$status);//如果你是python3的運行環境就用這句
print_r($out);//打印後輸出 Array ( [0] => hello world 5and3)
print_r($status);
//打印$status後輸出顯示
//0:標準輸入 STDIN_FILENO
//1:標準輸出 STDOUT_FILENO
//2:標準錯誤 STDERR_FILENO
}
}
測試結果展示
1.實測代碼截圖:
2.返回結果截圖
總結:
這裏特別注意的就是php的exec()函數的使用
1.可能因爲安全模式被禁用,這裏需要你自行在php配置中解除此函數的禁用(解除禁用後可能存在安全風險)。
2.exec(參數1,參數2,參數3);
參數1:需要執行的語句 string型
參數2:執行語句後接收返回結果的變量 array型
參數3:執行與與語句後接收返回結果狀態碼的變量 int型
-
參數1 的結尾 ‘2>&1’沒有這句話無法顯示報錯信息。
-
參數3的返回值是int型,分別表示:
0:標準輸入 STDIN_FILENO
1:標準輸出 STDOUT_FILENO
2:標準錯誤 STDERR_FILENO
將2和重定向到1可以使用:2>&1
exec(command+’" 2>&1",$res);print_r($res);//這樣就可以看到標準錯誤流的內容了。