Windows Ubuntu子系统Python脚本执行失败:ModuleNotFoundError等问题
解决WSL中Python脚本使用tablib生成Excel的报错问题
看起来你遇到的核心问题是代码逻辑的小疏漏加上tablib在不同环境下的解析行为差异,导致WSL里运行报错,而Windows下因为版本兼容逻辑没暴露问题。下面一步步拆解解决:
先看两个报错的根源
1. Python3.6下的TypeError: the JSON object must be str, bytes or bytearray, not 'dict'
你的报错行data1 = json.loads(list_with_bugs)犯了一个基础错误:list_with_bugs(也就是call_api_call()返回的内容)已经是json.loads(response.text)解析后的Python字典/列表对象了,完全不需要再用json.loads()去解析它——这个方法只能处理字符串/字节类型,直接对字典调用自然会抛出类型错误。
2. Python3.7下的KeyError: 0
当你把json.dumps(dataset_list)赋值给data.json时,tablib会自动把这个JSON字符串再用json.loads()转成Python对象,然后尝试把它转换成数据集。如果你的dataset_list不是行数据的列表(比如是单个字典,或者顶层结构是字典而非列表),tablib在尝试访问解析后对象的第0个元素(pickle[0])时,就会因为顶层是字典没有索引0而抛出KeyError。
修正后的代码方案
直接跳过多余的JSON序列化步骤,把call_api_call()返回的Python对象直接传给tablib的dict属性(或者用load方法),同时确保数据结构符合tablib的要求:
import tablib import os from datetime import date # 获取API返回的已解析Python对象 dataset_list = call_api_call() # 关键:确保数据是行数据的列表(tablib要求的格式) # 如果API返回的是单个字典(比如一条数据),就包装成列表 if not isinstance(dataset_list, list): dataset_list = [dataset_list] data = tablib.Dataset() # 直接赋值Python对象给data.dict,不需要转JSON字符串 data.dict = dataset_list # 或者更简洁的写法:用load方法加载字典格式的数据 # data.load(dataset_list, format='dict') # 生成Excel并保存 data_export = data.export('xlsx') # 用os.path.join拼接路径更安全,避免手动拼接的错误 script_dir = os.path.dirname(os.path.realpath(__file__)) filename = os.path.join(script_dir, f"{date.today()}.xlsx") with open(filename, 'wb') as f: f.write(data_export)
额外注意事项
- WSL路径与权限:确保脚本输出路径(
/mnt/c/...)有写入权限,WSL默认挂载Windows目录的权限比较宽松,但如果遇到权限问题,可以用chmod调整脚本所在目录的权限。 - crontab配置:
- 要使用WSL的绝对路径写crontab任务,比如:
0 9 * * * /usr/bin/python3.7 /mnt/c/Users/marialena/source/repos/GitLab_Issues/gitlab.py - 可以先用
which python3.7确认Python的绝对路径,避免crontab找不到命令。 - 建议把脚本的输出和错误重定向到日志文件,方便排查问题:
0 9 * * * /usr/bin/python3.7 /mnt/c/Users/marialena/source/repos/GitLab_Issues/gitlab.py >> /mnt/c/Users/marialena/source/repos/GitLab_Issues/cron_log.txt 2>&1
- 要使用WSL的绝对路径写crontab任务,比如:
- 忽略
apt_pkg报错:这个错误是WSL系统的apport异常钩子导致的,和你的脚本无关,你可以通过在crontab或终端里设置export PYTHONAPPORT=0来关闭这个钩子,避免看到无关错误。
内容的提问来源于stack exchange,提问作者Marialena
相关产品推荐
相关产品推荐

