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
相关产品推荐
相关产品推荐

