浅谈PHP运行Python脚本的方法

来自:互联网
时间:2021-03-23
阅读:

注:本次问题产生的环境是建议在windows环境下,利用IIS+PHP去调用Python脚本失败的前提下。如果你的环境与本次问题的环境不符。请自动规避。

在产品需求分析到一定阶段,各个部门之间需要一定的协调。然后我们做全栈开发的就需要把这些都笼统协调起来。也就出现了后台同时去调起不同模块、不同开发语言的需求。

首先后台使用的是IIS+PHP的环境,且运行在windows上。通过PHP去调用Python的程序。

先说问题:在Python、PHP都加入系统的环境变量(且在cmd的模式下能正常运行)的前提下,通过运行a.php去调起1.py

PHP代码(a.php)

$result = exec("py 1.py");
var_dump($result);

Python代码(1.py)

print("123");
fl=open('test3.txt', 'w')
fl.write("5,5,5,1,2,3")
fl.close()

两个目录文件在同一目录下。且IIS可执行权限给足(为了重现问题所在,就写了最简单的代码)然后就出现了运行报错。

然后我将PHP代码改进,查看exec函数执行的错误状态码

$result = exec("py 1.py", $array, $ret);
var_dump($result);
var_dump($array);
var_dump($ret);

发现错误码为103(执行错误)

这一次我就将exec函数中的bash改成了标准输出(为了确定具体错误信息)

PS:在bash中0,1,2三个数字分代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即标准输入(一般是键盘),标准输出(一般是显示屏,准确的说是用户终端控制台),标准错误(出错信息输出)。

$result = exec("py 1.py 2>error.txt", $array, $ret);
var_dump($result);
var_dump($array);
var_dump($ret);

这一次运行以后,打开error.txt居然出现了:Can't find a default Python.这种错误(前提我是将python加入了环境变量且cmd状态下能直接运行py文件),感觉就遇到了不能言语的错误。在充分排查环境变量、可执行权限等错误以后。我下意识的将exec里面的执行语句改成了

"python 1.py 2>error.txt"

这一次给我的错误居然是【'python' 不是内部或外部命令,也不是可运行的程序或批处理文件。】我甚至一度怀疑这台电脑有了他自己的想法。就在翻遍所有资料后。我突然想起可能是由于PHP是运行在IIS的服务器上,然而IIS并不是一个所有用户权限(这一点即是IIS建站目录权限控制的优点,又是IIS建站的缺点)。结合之前error.txt文件报的错误。我就将代码做一下修改。

$res = exec("你python的安装绝对路径/python.exe 1.py 2>error.txt", $array, $ret);
var_dump($result);
var_dump($array);
var_dump($ret);

然后将python这个文件下所有文件的用户拥有者增加一个IIS用户控制可执行权限。

这次PHP能找到了Python的可执行exe,成功将我们的代码执行了。

PS:IIS+Windows 不亏是一个黑洞。

返回顶部
顶部