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

pip安装Python包后npz数据文件损坏无法被numpy加载的问题问询

问题描述

我的Python包目录结构如下:

  • setup.py
  • Main Package
    • Data Directory
      • file1.npz
      • file2.npz
      • filen.npz
    • Module 1
    • Module 2
    • Module n
    • init.py

未执行pip install或setup.py install时,直接运行代码可通过np.load()正常加载这些.npz数据文件;但执行pip install .或setup.py install安装包后,导入包调用np.load()会抛出错误:

ValueError: Cannot load file containing pickled data when allow_pickle=False

设置allow_pickle=True后,又会抛出:

OSError: Failed to interpret file as a pickle

通过sha256sum校验发现,本地数据文件与安装后的文件哈希值完全不同,说明pip或distutils在安装过程中修改了数据文件。我的setup.py代码如下:

setup(
    name="main_package",
    version="0.1",
    description="(...)",
    author="(...)",
    packages=["main_package",
                "main_package.module1",
                "main_package.module2",
                "main_package.module3",
                "main_package.module4",
                "main_package.module5",
                "main_package.Data Directory"
                ],
    package_data={"main_package": ['Data Directory/*.npz']},
    ext_modules=extensions,

)

其中extensions及其他前期定义的功能未涉及数据目录。运行环境为Fedora36。

问题原因与解决方案

原因分析

pip/distutils默认会对文本文件做编码转换(比如换行符、编码格式适配),但.npz是二进制文件,因目录名包含空格导致工具识别异常,误将其当作文本文件处理,二进制数据被破坏,最终出现哈希值变化、numpy无法加载的问题。

核心问题在于Data Directory的目录名不符合Python包命名规范(不允许包含空格),同时setup.py中packages列表里的main_package.Data Directory写法错误,package_data的路径也因空格触发工具的错误处理逻辑,导致二进制文件被篡改。

解决步骤

  1. 重命名数据目录:将Data Directory改为符合规范的名称,比如data_directory(全小写、无空格,用下划线分隔),同时在该目录下添加空的__init__.py文件,让Python识别为合法子包。

  2. 修正setup.py配置:

    • 更新packages列表,替换错误的包名为main_package.data_directory;
    • 更新package_data的路径为['data_directory/*.npz']。

修正后的setup.py示例:

setup(
    name="main_package",
    version="0.1",
    description="(...)",
    author="(...)",
    packages=["main_package",
                "main_package.module1",
                "main_package.module2",
                "main_package.module3",
                "main_package.module4",
                "main_package.module5",
                "main_package.data_directory"
                ],
    package_data={"main_package": ['data_directory/*.npz']},
    ext_modules=extensions,
)
  1. 重新安装包:先执行pip uninstall main_package卸载旧版本,再运行pip install .重新安装。

  2. 调整数据加载路径:代码中使用标准库工具获取安装后的数据文件路径,避免硬编码,示例:

from importlib.resources import files
import numpy as np

data_path = files('main_package.data_directory').joinpath('file1.npz')
data = np.load(data_path, allow_pickle=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:35:15