如何从PHP向yolo_video.py传参?Pepper机器人目标识别脚本中断
解决PHP向Python传参及Pepper机器人YOLO识别的异常问题
我来一步步帮你搞定这两个关联问题,结合你的Windows环境和Pepper机器人场景,分PHP端和Python端逐一修正:
一、先解决PHP端的传参错误与exec执行问题
你的PHP代码里首先存在变量名拼写错误,同时Windows下调用Anaconda虚拟环境的exec命令有格式细节需要注意:
1. 修正变量名错误
你提到原本要传递的是$classe,但代码里误写为$who,先把变量名统一并确保前端参数正确获取:
// 假设前端通过POST传递目标类名,先验证变量有效性 $classe = isset($_POST['target_class']) ? $_POST['target_class'] : ''; if(empty($classe)) { die("请选择待识别的目标类名"); }
2. 修正exec命令的格式问题
Windows下调用Anaconda虚拟环境需要用cmd /c包裹命令,同时给路径和参数加双引号避免空格截断,还要捕获错误输出方便调试:
// 拼接命令时处理路径和参数的引号,同时捕获错误输出 $command = 'cmd /c "C:/Anaconda/Scripts/activate yolo && cd "C:/wamp64/www/app/projetba3/" && python yolo_video.py --image "' . $classe . '" 2>&1"'; exec($command, $output, $return_var); // 调试用:输出命令和结果,快速定位问题 echo "执行命令:" . $command . "<br>"; echo "返回状态码:" . $return_var . "<br>"; echo "输出内容:" . implode("<br>", $output);
cmd /c:告诉Windows用命令提示符执行后续命令并退出2>&1:把错误输出重定向到标准输出,让你能看到脚本中断的具体原因- 双引号包裹路径/参数:避免路径或类名含空格导致命令被意外截断
二、解决Python脚本的参数冲突与读取错误
你的脚本同时混用sys.argv和argparse是核心冲突点,而且错误地读取了sys.argv[1](它实际是--image这个参数标识,不是类名值),必须统一用argparse处理参数:
1. 重构Python的参数处理逻辑
完全用argparse定义和解析参数,删除手动读取sys.argv的代码:
import argparse def main(): parser = argparse.ArgumentParser(description='YOLOv3目标识别与Pepper角度计算') # 定义--image参数,接收PHP传递的目标类名 parser.add_argument('--image', type=str, required=True, help='待识别的目标类名') args = parser.parse_args() # 现在直接通过args.image获取PHP传递的类名 print(f"收到目标类名:{args.image}") # 后续执行你的目标检测、角度计算逻辑 # ...(此处保留你原有的检测、计算代码) # 最后将角度结果输出到标准输出,让PHP能捕获到 # 示例:假设计算得到的角度为angle_result print(f"angle:{angle_result}") if __name__ == '__main__': main()
- 统一用
argparse避免参数解析冲突,逻辑更清晰 - 用
print输出结果,PHP的$output数组就能捕获到这些内容
2. 验证Python脚本的正确性
先在命令行测试修正后的脚本,确保参数能正确读取并执行完整逻辑:
# 激活虚拟环境 C:/Anaconda/Scripts/activate yolo # 进入脚本目录 cd C:/wamp64/www/app/projetba3/ # 测试传参 python yolo_video.py --image "person"
如果能正常输出类名和角度结果,说明脚本参数逻辑没问题了。
三、联调测试与问题排查
- 先验证PHP能正确获取前端的类名(用
var_dump($classe)查看) - 执行PHP脚本,查看
exec返回的$output和$return_var:- 若
return_var不为0,说明命令执行失败,看output里的错误信息(比如虚拟环境路径错误、脚本权限问题) - 若
return_var为0,检查output里是否包含你预期的角度结果
- 若
额外注意事项
- 确保Pepper拍摄的照片路径在Python脚本中可访问,避免权限或路径错误
- 若脚本需要GPU加速,确认Anaconda的yolo虚拟环境已正确配置CUDA和cuDNN
- 调试时可以用
shell_exec()替代exec(),它会返回整个输出字符串,更直观
内容的提问来源于stack exchange,提问作者ThomasGuily
相关产品推荐
相关产品推荐

