You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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"

如果能正常输出类名和角度结果,说明脚本参数逻辑没问题了。

三、联调测试与问题排查

  1. 先验证PHP能正确获取前端的类名(用var_dump($classe)查看)
  2. 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:33:12