注:本次问题产生的环境是建议在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(执行错误)
【推荐学习:《PHP视频教程》】
这一次我就将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 不亏是一个黑洞。
更多编程相关知识,请访问:编程视频!!
以上就是浅谈PHP运行Python脚本的方法的详细内容,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)