通过PHP调用复杂Python脚本无结果,终端运行正常求助
问题描述
我在同一Web主机的同一目录下,通过PHP脚本调用Python脚本。第一个简单示例运行完全正常:
PHP代码:
<?php shell_exec("python main.py"); echo"success"; ?>
Python简单脚本:
import os os.popen('cp uploads/1.jpg sessions/1.jpg')
但换用以下更复杂的Python脚本后,却没有任何结果。该脚本在终端执行时完全正常:
import cv2 import datetime import pytz tz_London = pytz.timezone('Europe/London') datetime_London = datetime.datetime.now(tz_London) name = datetime.date.today().strftime("%y-%m-%d-") + (datetime_London.strftime("%p")) face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml') width = 295 height = 360 dim = (width, height) filename = "sessions/%s_1.jpg" % name img = cv2.imread('uploads/1.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.1, 4) for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x +100 + w -100, y +100 + h -50), (0, 0, 255), 2) faces = img[y:y +50 + h, x:x + w] faces = cv2.resize(faces, dim) cv2.imwrite(filename, faces) print(name)
解决方案
1. 指定Python环境绝对路径
Web服务器(如Apache/Nginx)运行PHP的系统用户,和你终端登录的用户环境不同,默认python指向的环境可能未安装cv2、pytz等依赖。
- 终端执行
which python3获取完整路径(如/usr/bin/python3) - 修改PHP代码:
shell_exec("/usr/bin/python3 main.py");
2. 捕获错误输出排查问题
shell_exec默认只返回标准输出,错误信息会被丢弃,修改代码将错误输出重定向:
<?php $output = shell_exec("python3 main.py 2>&1"); echo "执行输出: " . $output; echo "success"; ?>
通过输出可以直接看到脚本执行时的报错(如依赖缺失、文件找不到等)。
3. 检查文件/目录权限
Web服务器用户(如www-data)可能没有对应权限:
- 确保
sessions目录有写入权限:chmod 755 sessions - 确保
uploads/1.jpg、haarcascade_frontalface_alt2.xml有读取权限:chmod 644 uploads/1.jpg haarcascade_frontalface_alt2.xml - 建议给
haarcascade_frontalface_alt2.xml指定绝对路径,避免相对路径找不到。
4. 安装缺失的依赖
终端环境安装了依赖,但Web用户的Python环境可能没有:
- 以Web用户身份安装:
sudo -u www-data pip3 install opencv-python pytz - 或用绝对路径的pip安装:
/usr/bin/pip3 install opencv-python pytz
5. 检查服务器资源限制
OpenCV人脸检测脚本可能需要更多内存,Web服务器的进程资源限制可能导致脚本被终止。可以查看服务器错误日志(如Apache的error.log)确认是否有相关报错。
内容的提问来源于stack exchange,提问作者Piet Bez
相关产品推荐
相关产品推荐

