不同虚拟机中同一份Python字典排序脚本报错求助
问题分析:字典排序时触发
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType' 背景还原
你写了个Python脚本用来收集数据并写入字典,在一台虚拟机上跑完全正常,但换到另一台虚拟机时,哪怕脚本完全一样、字典结构也匹配(只是数值不同),却突然抛出了上面这个错误。你的排序代码是这样的:
directorios = sorted(dicta.items(), key=lambda x: [int(x) for x in x[1].values()], reverse = True)
预期是把字典按嵌套里的数值降序排列,比如示例字典:
{'data1': {'/home/data1': 273}, 'data2': {'/home/data2': 2}, 'data3': {'/home/data3': 10}, 'data4': {'/home/data4': 1}}
排序后得到:
{'data1': {'/home/data1': 273},'data3': {'/home/data3': 10}, 'data2': {'/home/data2': 2},'data4': {'/home/data4': 1}}
问题根因
虽然两台机器Python版本一致,但报错的核心很明确:在出问题的虚拟机上,你的dicta字典里,有某个嵌套字典的值是None,而不是你预期的数字/可转成int的字符串。
为什么会出现这种情况?大概率是两台虚拟机的环境差异导致数据收集环节出了问题:
- 比如目标路径(
/home/data1这类)在报错机器上不存在,或者当前用户没有访问权限; - 数据收集时调用的命令/工具在这台机器上执行失败,返回了空值;
- 脚本里的异常捕获逻辑没覆盖到某些场景,导致获取数值失败时直接写入了
None。
你当前的排序代码默认所有x[1].values()都是能转成int的有效值,但一旦碰到None,int(None)就会直接炸锅。
解决思路与修复方案
1. 先定位None的来源
在排序代码前加一段调试代码,把字典里的所有值都打出来,看看哪个条目出了问题:
# 调试用:打印所有条目,检查是否有None for main_key, nested_dict in dicta.items(): for path, value in nested_dict.items(): print(f"主key: {main_key}, 路径: {path}, 值: {value}, 类型: {type(value)}")
运行后找到值为None的条目,然后回溯数据收集的代码——看看是路径不存在?命令执行报错?还是权限不够?针对性修复数据收集逻辑,确保所有值都是有效数值。
2. 给排序代码加容错处理
如果暂时没法彻底修复数据收集的问题,或者需要脚本兼容偶尔出现的None,可以修改排序的key函数,处理None的情况:
# 方案1:把None当成0,让它排在最后 directorios = sorted( dicta.items(), key=lambda x: int(next(iter(x[1].values()), 0)), # 取嵌套字典的唯一值,默认0 reverse=True ) # 方案2:直接过滤掉值为None的条目 directorios = sorted( [(k, v) for k, v in dicta.items() if next(iter(v.values())) is not None], key=lambda x: int(next(iter(x[1].values()))), reverse=True ) # 方案3:显式处理各种异常情况,更健壮 def get_sort_key(item): nested_values = list(item[1].values()) if not nested_values: return 0 val = nested_values[0] try: return int(val) except (TypeError, ValueError): return 0 # 非数值的情况也当成0处理 directorios = sorted(dicta.items(), key=get_sort_key, reverse=True)
另外提一句:你的原始代码里用[int(x) for x in x[1].values()]生成列表当排序key,其实每个嵌套字典只有一个值,直接用next(iter(x[1].values()))取这个值就行,不用转成列表,代码更简洁高效。
3. 统一两台虚拟机的运行环境
检查两台机器的这些差异:
- 目标路径是否都存在,且运行脚本的用户有读写权限;
- 数据收集依赖的命令/工具是否都安装了,版本是否一致;
- 是否用同一个用户运行脚本,环境变量有没有差异。
内容的提问来源于stack exchange,提问作者user6593995
相关产品推荐
相关产品推荐

