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);//这样就可以看到标准错误流的内容了。