【问题标题】:Can´t freeze a script with matplotlib basemap and cx_freeze无法使用 matplotlib 底图和 cx_freeze 冻结脚本
【发布时间】:2014-10-09 19:38:22
【问题描述】:

再次返回。我还在努力,但我无法修复它

脚本运行良好,但是当我使用 cx_freeze 冻结它时,会出现 cx_freeze 错误。

在消息的末尾说

OSError:proj 数据目录未找到。期待它在:C:\python34........mpl_toolkits\basemap\data

cx_freeze 创建的构建目录中没有包含数据吗?

我正在使用以下脚本进行冻结

base = None

def find_data_file(pyproj):
    if getattr(sys,'XXXXs.exe',False):
        datadir = os.path.dirname(sys.aaEjecutable.py)
    else:
        datadir = os.path.dirname(__file__)
    return os.path.join(datadir,pyproj)

if (sys.platform == "win32"):
    base = "Win32GUI"

exe = Executable(
        script = "Conver.py",  
        icon = "logo4.ico",
        targetName = "XXXXs.exe", 
        base = base
        )
includefiles = ["Logo1.jpg","Logo2R.jpg","Logo2R.jpg","logo4.ico",
                (('C:\Python34\Lib\site-packages\mpl_toolkits'),("mpl_toolkits"))] 
setup(
    name = "Conver",
    version = "V3",
    description = "conve",
    author = "Jose ",
    options = {"build_exe": {"include_files":includefiles}}, 
    executables = [exe]
)

我认为它有问题。我必须包含底图,但我不知道该怎么做

我无法前进。脚本很好,但我可以在没有 python 的计算机上使用它

谢谢

【问题讨论】:

  • 即使包含在内,它也可能无法使用:cx_Freeze 将包放入一个 zip 文件中,而 matplotlib 可能希望它是一个常规文件夹。
  • 我该如何解决这个问题?
  • 使用 includefiles 选项将 basemap/data 目录复制到您的构建目录中。然后在代码中加载底图之前将环境变量BASEMAPDATA 设置为该目录的位置。 See the FAQ 了解如何计算该位置。
  • 好吧,我的速度太慢了,无论如何我希望能修复它。我编辑了我的冻结脚本,包括: options = {"build_exe": {"include_files":[( matplotlib.get_data_path(),"mpl-data"),"Logo3.jpg","Logo2.jpg","Logo1.jpg ","icon.ico"],}},我可以看到包含 basemapdata 的文件夹包含在构建中,但问题仍然存在。我知道我必须修改脚本(而不是冻结脚本)才能知道底图数据冻结时的位置。我看到了推荐的链接,但我不明白怎么做 thnaks
  • 它看起来 类似于 if getattr(sys, 'frozen', False): os.environ['BASEMAPDATA'] = os.path.join(os.path.dirname(sys.executable), 'basemapdata')。您可能需要稍微调整一下,但它基本上说:如果在冻结的应用程序中运行,请将 BASEMAPDATA 环境变量设置为从我的 exe 位置计算的路径。

标签: cx-freeze matplotlib-basemap


【解决方案1】:

我在使用 Python 3.4 和 cx_freeze 4.3.3 时遇到了类似的问题。我的修复需要 2 处更改:

  1. 在 cx_freeze 设置脚本中:

    buildOptions = dict( include_files = [("C:/Python34/Lib/site-packages/mpl_toolkits/basemap/data","data")])
    
  2. 在我使用底图的模块中:

    import sys, os
    if getattr(sys, 'frozen', False):
       os.environ['BASEMAPDATA'] = os.path.join(os.path.dirname(sys.executable), 'data')
    from mpl_toolkits.basemap import Basemap
    

根据要求,我的完整设置脚本是:

from cx_Freeze import setup, Executable

buildOptions = dict(packages = ['osgeo._gdal'], excludes = [], \
    include_files = [("C:/Python34/Lib/site-packages/mpl_toolkits/basemap/data","data")])

import sys
base = 'Win32GUI' if sys.platform=='win32' else None

executables = [
  Executable('main.py', base=base, targetName = 'xxxxxxx.exe', icon='ico/xxxxx.ico')
  ]

setup(name='Xxxxx',
  version = '0.0.1',
  description = 'Xxxxx xxxx xxxx',
  author = 'xxxxxxx@xxx.edu',
  options = dict(build_exe = buildOptions),
  executables = executables)

【讨论】:

  • 仍然没有运行。错误:OSError:找不到项目数据目录。期待:C:\\Python34.........library.zip\mpl_toolkits\basemap\data 你能告诉我你的安装脚本吗?
  • 我相信问题不在于安装脚本。你在构建目录中有Data 文件夹吗?
  • 我的回答的第 1 点使 cx_freeze 复制了“构建”目录中的“数据”文件夹内容,然后第 2 点告诉底图它可以在哪里找到“数据”。第 2 点必须在您使用底图导入之前出现!如果更改os.environ['BASEMAPDATA'],则错误消息至少应更改Expecting at: 部分。希望这可以澄清!
  • 嗯,我认为 smoething 正在运行...我包含在我的脚本的开头(使用 matplotlib 底图运行)但是现在当我运行 exe 文件时出现了一个不同的错误。 ''导入错误:没有名为'matplotlib.backends.backend_tkagg'的模块。感谢您的合作
  • 您使用的是哪种类型的后端?您的应用程序实际上需要tk 吗?我同时使用pysidepyqt 没有问题。不过,我相信你应该对你的新问题提出一个全新的问题,也许接受我的回答:)
【解决方案2】:

一种无需硬编码即可始终获取底图数据目录的方法

import matplotlib from mpl_toolkits import basemap build_options = dict( include_files = [(basemap.basemap_datadir, 'data')])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多