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

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)

额外注意事项

  1. WSL路径与权限:确保脚本输出路径(/mnt/c/...)有写入权限,WSL默认挂载Windows目录的权限比较宽松,但如果遇到权限问题,可以用chmod调整脚本所在目录的权限。
  2. 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
      
  3. 忽略apt_pkg报错:这个错误是WSL系统的apport异常钩子导致的,和你的脚本无关,你可以通过在crontab或终端里设置export PYTHONAPPORT=0来关闭这个钩子,避免看到无关错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:47:09