今天将老板一个项目的服务器代码语言从 Java 改成了 PHP,因为算法是用 Python 写的,所以就需要在 PHP 中调用 Python 脚本,包括向 Python 传参,Python 接收参数后处理数据,再把处理结果传回给 PHP,最后 PHP 返回给客户端。在 PHP 中使用的工具是 exec 调用的 Python 脚本,本文记录下使用教程。
一、在 php.ini 中开启 exec
出于安全考虑,PHP 的 exec 命令默认是关闭的,所以我们首先需要开启 exec。
如果你也使用的是 LNMP 一键安装包,那么 php.ini 路径是在 /usr/local/php/etc
下,编辑 php.ini,在 disable_functions
后面将 exec 删了即可,之后用 lnmp php-fpm restart
重启 PHP 服务。
二、PHP 调用 Python 教程
这里首先放一下我的调用代码,之后再逐一介绍参数:
exec("python3 /home/wwwroot/*******/SeeAir/Main.py {$lat} {$lng} {$folder_path} {$image_name}", $out, $res);
exec 一共有 3 个参数,即 exec ( string $command [, array &$output [, int &$return_var ]] )
,在 $command 中完成从 PHP 向 Python 的传参,Python 对 PHP 的返回值则存在 $output 中:
- 第一个参数就是调用 Python 代码的命令行命令,跟我们直接在命令行调用 Python 一样。以我的调用代码为例,我一共向 Python 传递了 4 个参数,$lat、$lng、$folder_path、$image_name 都是 PHP 变量,也是 Python 代码中需要用到的变量;
- 第二个参数就是 Python 运行过程全部的输出,例如所有 print 的数值都会存在 $out 中,而 $out 是一个数组,如果我只需要 $out 最后一个输出,那么就可以借助 end 函数:$value = end($out);
- 第三个参数 $res 返回是否调用成功,0 代表成功,1 代表失败。
以上就是老王这次在 PHP 调用 Python 脚本的全部过程,总的来说还是比较方便的,跟命令行直接用 Python 脚本差不多。