CX_FREEEZE,INNO:找不到 matplotlib 数据文件

Posted

技术标签:

【中文标题】CX_FREEEZE,INNO:找不到 matplotlib 数据文件【英文标题】:CX_FREEEZE, INNO : could not find the matplotlib data files 【发布时间】:2014-08-13 16:11:24 【问题描述】:

我从 python 脚本和 cx_freeze 创建了一个可执行文件。冷冻看起来不错。但是当我使用 INNO 创建安装文件时,我遇到了问题。我可以创建设置并成功部署应用程序。但是,当我从“Program Files (x86)”目录启动它时,我遇到了运行时错误:找不到 matplotlib 数据文件

C:\Program Files (x86)\GLADDataExtraction>main
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in <module>
    exec(code, m.__dict__)
  File "main.py", line 8, in <module>
  File "C:\Python27\lib\site-packages\matplotlib\__init__.py", line 947, in <module>
    rcParams = rc_params()
  File "C:\Python27\lib\site-packages\matplotlib\__init__.py", line 865, in rc_params
    return rc_params_from_file(fname, fail_on_error)
  File "C:\Python27\lib\site-packages\matplotlib\__init__.py", line 930, in rc_params_from_file
    ret['datapath'] = get_data_path()
  File "C:\Python27\lib\site-packages\matplotlib\__init__.py", line 312, in wrapper
    ret = func(*args, **kwargs)
  File "C:\Python27\lib\site-packages\matplotlib\__init__.py", line 655, in _get_data_path_cached
    defaultParams['datapath'][0] = _get_data_path()
  File "C:\Python27\lib\site-packages\matplotlib\__init__.py", line 651, in _get_data_path
    raise RuntimeError('Could not find the matplotlib data files')
RuntimeError: Could not find the matplotlib data files

我在互联网上广泛寻找解释但没有成功。有许多主题与 py2exe 相关,但没有与 cx_freeze 相关。 我调查了我的 cx_freeze setup.py 文件,显示如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Python 2.7
# 02/2011

import sys, os
from cx_Freeze import setup, Executable
import matplotlib

#############################################################################
# préparation des options

# chemins de recherche des modules

path='D:\\IceSat\\tests\\test_executable\\test_GLASDataExtraction'

if os.path.exists(path):
    print "exist"

if path in sys.path:
    print "OK"
else:
    print "insert"
    sys.path.append(path)


path = sys.path + ["package_interface", "package_traitement"]

##build_exe_options =  'packages': ['scipy'],
##                     "include_files": [('C:\\Python27\\Lib\\site-packages\\scipy\\special\\_ufuncs.pyd','_ufuncs.pyd')]




# options d'inclusion/exclusion des modules
##includes = ["sip", "matplotlib"]
includes = ["sip"]
##excludes = ["tk","tcl"]
excludes = []
##packages = ["scipy", "scipy.signal", "scipy.special", "matplotlib", "matplotlib.mpl-data"]
##packages = ["scipy", "scipy.signal", "scipy.special", "matplotlib",  "matplotlib.backends"]
##packages = ["scipy", "scipy.signal", "scipy.special", "matplotlib"]
packages = ["scipy", "scipy.signal", "scipy.special"]
##packages = ["scipy", "scipy.signal", "scipy.special", "matplotlib", "matplotlib.backends", "matplotlib.mpl-data"]



### construction du dictionnaire des options
options = "path": path,
           "includes": includes,
           "excludes": excludes,
           "packages": packages,
##           "include_files": includefiles,
           "include_files":[(matplotlib.get_data_path(),"mpl-data")]
##           "include_files":[(matplotlib.get_data_path(),"HDE")]
####           "include_files":[matplotlib.get_data_path(),"C:\\Python27\\Lib\site-packages\\matplotlib\\mpl-data"]
##           "bin_path_includes": binpathincludes
           


# création du setup
setup(
    name = "GLASDataExtraction",
    version = "1",
    description = "Extraction et analyse de data GLAS",
    author = "Henri",
    options = "build_exe": options,
##    executables = [cible_1]
    executables=[Executable("main.py")]
    )

有很多 cmets,因为我试图在不影响构建目录的情况下尽可能简化 setup.py 文件。 启动后

​​>
python setup.py build

在 DOS 窗口中,创建目录 'build/exe...'。 里面有:

library.zip 文件包含许多包(matplotlib 在里面,但没有 mpl-data,它看起来不像一个包,因为没有 init.py 文件)。 许多 .pyd 文件 4 目录:imageformats、mpl-data、tcl、tk。 mpl-data 有 其内容。

然后,使用 INNO 应用程序在“Program Files (x86)”目录中创建我的安装文件。我使用此安装文件启动安装。看起来不错。我的程序目录是用很少的目录和文件创建的。来自“C:\Python27\Lib\site-packages\matplotlib\mpl-data”的文件就在这些文件中。但是当我启动 .exe 文件时,出现错误“RuntimeError:找不到 matplotlib 数据文件”。

我的配置是:

WINDOWS 7 64 位 python 2.7 64 位 cx_freeze 4.3.3 创新 5.5.5 pyqt4

【问题讨论】:

你能在制作安装程序之前从构建目录运行冻结的exe吗? IE。是冻结的问题,还是构建安装程序的问题? 【参考方案1】:

谢谢 Thomas,是的,我在制作安装程序之前首先运行了冻结的 exe。还可以。 我找到了一个解决方案:在导入目录时,inno 将所有文件复制到与 exe 文件(Program Files (x86) 目录)相同的目录中。但是如果我定义与冻结的exe相同的目录,我必须在路径Dest dir中添加mpl-data。在 iss INNO 脚本中: 脚本中的行是:

\build\exe.win-amd64-2.7\mpl-data\*"; DestDir: "app"; Flags: ignoreversion recursesubdirs createallsubdirs

我在iss文件的路径中添加了mpl-data目录,以便在安装目录和冻结目录中从exe到mpl-data文件的相对路径相同:

\build\exe.win-amd64-2.7\mpl-data\*"; DestDir: "app\mpl-data\"; Flags: ignoreversion recursesubdirs createallsubdirs

我编译,安装......它可以工作

【讨论】:

【参考方案2】:

在 lib/site-packages/pyinstaller/hooks 中查找并编辑 hook-matplotlib.py

从以下位置编辑数据部分:datas = [ (mpl_data_dir, "mpl-data"), ]

datas = [ (mpl_data_dir, "matplotlib/mpl-data"), ]

【讨论】:

以上是关于CX_FREEEZE,INNO:找不到 matplotlib 数据文件的主要内容,如果未能解决你的问题,请参考以下文章

Inno Setup Compiler“找不到指定的路径”错误,路径长

Inno 设置用户主路径

inno setup检查dotnet core是不是已安装[关闭]

高分请教Inno Setup 编译器高手

inno setup打包的安装文件更换位置后图标改变了

如何更改Inno Setup生成的卸载程序的名字与图标