最近有一个奇怪的需求,使用php调用python脚本,像下面这样写就可以了
exec("python 01.py 2>&1",$fh);
2>&1:可以返回脚本运行中出现的错误,建议加上不然不知道什么错误
$fh:返回脚本运行的结果,和上面一个是有区别的,如果用php调用python脚本的话后面不加2>&1 有错误也不会报出来的
注意:如果python脚本里面有读写文件的操作的话这样运行会报IOError: [Errno 13] Permission denied就是权限被拒绝
是因为被调用的python运行的时候读写文件的权限不够,但是在终端运行却没问题。不知道为什么(难道被php调用过的python脚本权限会降低???),这个时候只需要加一个--user就可以正常运行了,也就是让它有root权限,像下面这样
exec("python 01.py --user 2>&1",$fh);
2022/3/15更新
好吧上面的方法是行不通的,之前可以是因为在终端运行的时候加了-user赋予了python管理员权限,但只是暂时的时间久了会失效,找了一下还是没解决方法,最终还是修改的文件目录权限解决的。。
2023/9/19更新
又遇到这个问题了,还好当时写了篇文章来记录,用php调用python脚本的话,如果python和php脚本的目录不一致,用php调用python脚本的话是默认在php脚本的目录里,即便python没有在这个目录,也就是说如果python里面有获取当前目录的代码,然后用php调用这个python文件去运行,那么输出的会是这个php文件的目录,但是python单独运行的话那输出的就是python本来的目录了。。
2024/6/23更新
好吧又遇到了。。。莫名其妙可以了,应该是重启服务器的原因,修改一些权限还有安装python3添加环境变量,之后记得重启服务器试试。。。。
好好好,发现一个新坑,在linux上执行python相关代码的时候是分用户的,在终端下是root用户,用php 调用exec执行指令的话就是在www用户下执行的(注意宝塔面板的定时任务也是运行在一个虚拟环境),这是一点,还有就是在不同用户下执行python脚本那么都是在不同虚拟机里面执行的,这样做的好处是可以将不同用户运行环境分割开来,互不影响,好了如果执行python脚本需要安装一些库的话,如果只在终端安装的话,那么这个库就只能被运用于终端,其他用户虚拟环境下面用这个库的时候就会报ModuleNotFoundError: No module named 错误,也就是找不到这个库,想让所有用户都安装这个库,就需要在安装指令前面加上sudo才行,例如
sudo pip3 install requests
这样系统所有用户就可以用到这个库了。
还有一种情况如果我只想让某些特定的用户安装这个库,不需要所有用户都安装,也有办法,不过还没测试,有大佬测试了的可以评论区说一下结果,参考链接:解决php中通过exec调用python脚本报ModuleNotFoundError错误 - HOTAIGC团队 - 博客园 (cnblogs.com)