XAMPP本地调用Python脚本Base64解码返回NULL问题排查
问题排查与解决方案
1. 修复PHP变量解析问题
你的PHP代码中shell_exec使用了单引号,导致$param变量不会被解析,Python脚本实际收到的参数是字符串$param,而非编码后的酒店数据。修改方式:
- 将单引号改为双引号:
$result = shell_exec("python C:\\xampp\\htdocs\\bounce.py $param");
- 或者用字符串拼接:
$result = shell_exec('python C:\\xampp\\htdocs\\bounce.py ' . $param);
注意:Windows下路径分隔符要用双反斜杠\\,或者直接用正斜杠/避免转义问题。
2. 确保Python路径正确且可执行
- Windows下的shebang(
#! /Users/<user>/...)无效,可直接删除该行。 - 调用Python时使用完整路径(避免PATH环境变量问题),比如你的Python安装路径是
C:\Users\<user>\AppData\Local\Programs\Python\Python37\python.exe,则修改PHP代码:
$result = shell_exec('C:\\Users\\<user>\\AppData\\Local\\Programs\\Python\\Python37\\python.exe C:\\xampp\\htdocs\\bounce.py ' . $param);
- 检查Apache运行用户是否有Python程序和
bounce.py文件的执行/读取权限,必要时将文件权限设置为Everyone可读可执行。
3. 给Python脚本添加错误处理
原脚本未处理异常,若参数解析失败会直接崩溃,无任何输出,导致PHP拿到空值后json_decode返回null。修改Python脚本:
import sys import json import base64 try: # 检查是否传入参数 if len(sys.argv) < 2: raise ValueError("未传入参数") content = json.loads(base64.b64decode(sys.argv[1])) print(json.dumps(content)) except Exception as e: # 输出错误信息,方便PHP调试 print(json.dumps({"error": str(e)})) sys.exit(1)
4. 调试PHP执行结果
改用exec函数获取执行状态码和输出,方便排查问题:
$hotel = array("Name"=>$_POST["NAME"],..); $param = escapeshellcmd(base64_encode(json_encode($hotel))); $output = []; $returnCode = 0; exec('C:\\Users\\<user>\\AppData\\Local\\Programs\\Python\\Python37\\python.exe C:\\xampp\\htdocs\\bounce.py ' . $param, $output, $returnCode); $result = implode("\n", $output); $obj = json_decode($result); // 调试输出 if ($obj === null) { echo "执行失败,返回码:{$returnCode},输出:{$result}"; }
5. 检查POST参数有效性
确保$_POST["NAME"]存在且有值,可在PHP开头添加调试代码:
var_dump($_POST); // 查看所有POST参数
内容的提问来源于stack exchange,提问作者Mauro Ghiglia
相关产品推荐
相关产品推荐

