php exec 使用daemon用户 不同python环境的解决方案

前言

在php中我们可以通过 exec 函数来调起系统的一些操作。我们可以通过一个简短的示例来演示:

我们在目录 /opt/lampp/htdocs/prediction2/api/test 下编写一个index.php,执行pwd命令
php exec 使用daemon用户 不同python环境的解决方案
可以看到,命令顺利的执行了,我们获取了pwd执行的结果
php exec 使用daemon用户 不同python环境的解决方案
可是我们需要执行一个python脚本的时候,却会报错,说无法找到安装的模组(后面的 2>&1 参数就是输出错误信息用的)

php exec 使用daemon用户 不同python环境的解决方案
如图,显示找不到 bs4 模块
php exec 使用daemon用户 不同python环境的解决方案
可是明明已经安装了对应的模块(在终端执行过 pip install),并且相同的命令,在远程登录的终端执行能够成功,这是为啥呢?

原因分析

找不到模块,但是上文也提到过,在终端执行相同的命令,可以成功,而在php的exec中执行,却找不到模块。猜测是执行的时候,用户不同。因为不同用户具有不同的python环境。

我们让php执行whoami命令
php exec 使用daemon用户 不同python环境的解决方案
可以看到结果是 daemon 用户,即守护进程用户,而不是我们使用的ubuntu用户。
php exec 使用daemon用户 不同python环境的解决方案
果然。不同的用户具有不同的python环境。。。接下来介绍一些解决的办法

解决方案

sudo pip install

当初安装的时候,没有使用sudu命令。那么bs4这个包就安装在我登录终端的用户上面了。其他用户并不共享这个python环境。

使用pip直接安装,那么这个包仅当前用户可用。而当我们使用 sudo pip install 的时候,则这个包是全局可用的

所以,以后为了方便起见,还是使用 sudo pip install 安装罢

直接复制包文件夹

简单粗暴。我们在windows系统下安装的python包,直接拷贝到云服务器上py文件运行的目录,即可运行(但是有时候会有警告信息)
php exec 使用daemon用户 不同python环境的解决方案
注:windows下python的安装目录如下
php exec 使用daemon用户 不同python环境的解决方案

为daemon用户也安装对应的包

我们直接在php调用exec执行 python3.7 -m pip install bs4 即可发起安装(还是推荐使用sudo全局安装。。。)