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

Python Requests PUT/POST转exe后失效,STM32 IP更新异常求助

问题分析与解决方案

你的问题核心是:Python环境中PUT/POST请求正常,经PyInstaller打包成单文件无控制台exe后,请求数据出现异常(如IP首字节丢失),仅GET请求正常。结合环境版本和STM32 lwip库的场景,以下是针对性的排查和解决步骤:

1. 强制打包Requests依赖项

PyInstaller的自动依赖检测可能遗漏了Requests的部分底层依赖(如urllib3、chardet),导致打包后请求数据处理异常。重新打包时手动指定隐藏导入:

pyinstaller requests_PUT_not_working.py --onefile --noconsole --hidden-import requests --hidden-import urllib3 --hidden-import chardet --hidden-import idna

2. 排查请求数据差异

暂时去掉--noconsole参数,或在代码中添加日志记录,对比Python环境和exe运行时的请求内容:

import logging
logging.basicConfig(filename='req_debug.log', level=logging.DEBUG, format='%(asctime)s - %(message)s')

# 发送PUT请求前记录原始数据
payload = {"ip": "192.168.1.57"}
logging.debug(f"PUT Payload: {payload}")
logging.debug(f"Payload Bytes: {str(payload).encode('utf-8')}")

response = requests.put("http://your-stm32-url", json=payload)
logging.debug(f"Response Status: {response.status_code}")
logging.debug(f"Response Content: {response.text}")

运行exe后查看req_debug.log,确认发送的数据是否和Python环境一致,重点检查IP字段的字节编码是否完整。

3. 切换打包模式测试

单文件模式(--onefile)会在运行时将程序解压到临时目录,可能引发资源加载或数据处理的异常。先尝试目录模式打包验证:

pyinstaller requests_PUT_not_working.py --onedir --noconsole

如果目录模式下PUT/POST正常,说明问题出在单文件的临时解压环节,可尝试在代码中添加临时目录权限处理,或保持目录模式部署。

4. 调整PyInstaller/Requests版本

当前PyInstaller 5.1与Python 3.10.2可能存在兼容性问题,尝试升级或降级版本:

  • 升级PyInstaller到最新稳定版:pip install --upgrade pyinstaller
  • 降级Requests到2.28.x版本:pip install requests==2.28.2
    重新打包后测试是否解决问题。

5. 抓包对比请求差异

用Wireshark抓取Python环境和exe发送的PUT请求数据包,对比以下内容:

  • 请求头中的Content-Type、Content-Length是否一致
  • 请求体的字节流是否完全相同
    如果exe发送的数据包存在字节截断或编码差异,需在代码中显式指定数据编码和请求头,例如:
headers = {"Content-Type": "application/json; charset=utf-8"}
response = requests.put(url, json=payload, headers=headers)

内容的提问来源于stack exchange,提问作者Martin M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:39:52