Python使用pyinstaller打包含有gettext locales语言环境的项目(推荐)

问题

如何使用 pyinstaller 打包使用了 gettext 本地化的项目,最终只生成一个 exe 文件

起因

最近在用 pyhton 做一个图片处理的小工具,顺便接触了一下 gettext,用来实现本地化化中英文转换。项目主要结构如下:

.
|--src # 源码
|  |--package1
|  |--package2
|  |--locales # 本地化文件
|  |  |--en # 英文
|  |  |  |--LC_MESSAGES
|  |  |     |--en.mo
|  |  |--zh # 中文
|  |    |--LC_MESSAGES
|  |       |--en.mo
|  |--GUI.py # 界面
|  |--main.py # 主程序

直接使用 pyinstaller -F src\main.py 命令进行打包,打包后运行在 dist 文件夹中生成的 main.exe 会报错。原因是 gettext 找不到本地化文件。但如果试着将 locales 文件夹复制到 main.exe 的目录下程序能正常运行,说明 pyinstaller 在打包时不会将 locales 文件夹打包进去。

复制 locales 文件夹到可执行文件目录下固然可以运行,但这样用起来会很麻烦。

解决方案

​目标是将 locales 目录一起打包进 exe 文件中,查阅 pyinstaller 的官方文档,了解到执行之前的 pyinstaller -F src\\main.py 命令会在目录下生成一个 .spec 文件,pyinstaller 通过该文件的内容来构建应用程序。

the first thing PyInstaller does is to build a spec (specification) file myscript.spec. That file is stored in the --specpath directory, by default the current directory.

The spec file tells PyInstaller how to process your script. It encodes the script names and most of the options you give to the pyinstaller command. The spec file is actually executable Python code. PyInstaller builds the app by executing the contents of the spec file.

使用记事本打开,.spec 文件里面大致长这样(来自官方例子)

block_cipher = None
a = Analysis(['minimal.py'],
     pathex=['/Developer/PItests/minimal'],
     binaries=None,
     datas=None,
     hiddenimports=[],
     hookspath=None,
     runtime_hooks=None,
     excludes=None,
     cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
     cipher=block_cipher)
exe = EXE(pyz,... )
coll = COLLECT(...)

其中,Analysis 里面有个 datas 参数,用于存放非二进制文件,也就是我们想让程序包含的静态文件。我们只要把 locales 目录填到这里面打包就会添加进去。当然不是填一个路径就好了,data 的格式如下:

--add-data <SRC;DEST or SRC:DEST>

SRC 就是未打包前的文件路径,DEST 是打包后文件的路径。以我的项目为例,打包前 locales 在 src/locales,打包后我想讲里面的文件放到临时目录的根目录下就填 ./locales,临时目录是什么后面讲。于是在我的 .spec文件里 datas 处就写成 datas=[("src/locales","./locales")]。如果有多个路径就以这样形式 datas=[(src1, dest1), (src2, dest2), ...]就OK。

这样打包部分的配置就改完了,不要急,还要改下源代码。exe 文件在运行时会生成一个临时目录,我们之前 datas 中的文件也会在该目录下。看看你的源码,如果调用资源用的是相对路径,那读取的是 exe 文件当前的目录,必然是找不到资源的。所以要把源码中相对路径改成临时目录的绝对路径。

sys 中的 _MEIPASS 属性存储了临时目录路径,直接获取即可。如果程序运行环境是打包后的,那么在 sys 中会添加一个 frozen 属性,通过能不能获取 frozen 属性可以判断当前环境是打包前还是打包后,具体详情请查阅 pyinstaller 官方文档(末尾有地址)。打包前就不需要获取临时目录路径了,直接用文件所在目录路径就行。

注意:打包后环境 file 属性不生效

import sys
import os

if getattr(sys, 'frozen', None):
    dir = sys._MEIPASS
else:
    dir = os.path.dirname(__file__)

获取路径 dir,可以使用 os.path.join() 来拼接路径,把源码中调用 datas 中资源地方的路径改成 os.path.join(dir, <打包后相对路径>)

如我的项目中原来的 './locales' 处就变成了 os.path.join(dir, 'locales')

最后一步,打包!不要再输之前的命令了,要使用改过之后的 .spec 文件进行打包,输入 pyinstaller -F 文件名.spec 就完成了。

参考资料

pyinstaller 文档:Using Spec Files

pyinstaller 文档:Run-time Information

到此这篇关于Python使用pyinstaller打包含有gettext locales语言环境的项目的文章就介绍到这了,更多相关Python打包含有gettext locales语言环境的项目内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python之pyinstaller组件打包命令和异常解析实战

    项目场景: Python版本:3.8 因公司业务需求,须开发一套局域网内视频会议软件,此次采用Python实现此功能. 程序编写完并在编译器实现此功能后,采用pyinstaller组件打包成应用程序 问题描述: 在使用pyinstaller组件打包过程中,着实遇到一些问题,以下列出此次遇到主要的问题: 1.如何打包多个文件? 2.打包完运行后控制台显示"找不到指定模块.mkl_intel_thread.l.dll",图示如下: 3.打包如何排除不需要的组件以减少包的大小? 4.待补充

  • 如何利用pyinstaller打包Python程序为exe可执行文件

    序 对于如何将py文件打包生成exe可执行文件最简单的应该我觉得就是使用pyinstaller第三方模块 下面我就分为三个步骤给大家讲解如何使用 并分享一点小技巧 下面直接进入分享啦 安装pyinstaller第三方库 既然要安装第三方库,当然离不了pip install啦 直接使用pip install pyinstaller就可以安装啦 (不过这样似乎遇到第三方模块比较大的话就很慢甚至无法成功安装啦 ) 安装第三方库的小技巧 当然有解决办法呀 那就是使用国内镜像源 添加后就像是开挂了的 pi

  • 教你使用pyinstaller打包Python教程

    一.单个文件打包 1.1 简单打包 例如现在有一个main.py文件内容如下 import os print("hello world") os.system("pause") 运行结果如图 现在用一下命令打包成一个可执行文件pyinstaller -F main.py 再同级目录下生成一个dist文件夹里面就会生成一个可执行文件,双击就可以执行 1.2 带图标打包 有的时候为了美观,可以给可执行文件加一个图标,这时用这个命令pyinstaller -F main.

  • 使用pyinstaller打包python PyQt5程序

    目录 准备 工具准备 源代码准备 打包 参数说明 针对PyQt应用的改进 目前的小问题 解决办法 再次打包 代码仓库说明 当你有打包你的python应用的需求以后,你可能会像搜索引擎寻求帮助,你或许曾经搜索过"python 转 exe","python打包"等等这样的字眼,你或许曾看到过各种各样的相关解决方案,本文介绍的是其中的一种,但是可以负责任的说,这是目前最好的方案,并且是跨平台最好的方案,也就是说使用这个叫pyinstaller的工具,你可以把同样的代码打包

  • 用python打包exe应用程序及PyInstaller安装方式

    目录 1.PyInstaller简介 2.PyInstaller安装 3. 准备需要的文件 4.使用Pyinstaller 5.参数的含义 6. 附圣诞树源文件 7. 源文件下载 1.PyInstaller简介 PyInstaller是一个跨平台的Python应用打包工具,支持 Windows/Linux/MacOS三大主流平台,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,从而允许最终用户在无需安装 Python 的情况下执行应用程序. PyInstaller 制

  • Python使用pyinstaller打包含有gettext locales语言环境的项目(推荐)

    问题 如何使用 pyinstaller 打包使用了 gettext 本地化的项目,最终只生成一个 exe 文件 起因 最近在用 pyhton 做一个图片处理的小工具,顺便接触了一下 gettext,用来实现本地化化中英文转换.项目主要结构如下: . |--src # 源码 | |--package1 | |--package2 | |--locales # 本地化文件 | | |--en # 英文 | | | |--LC_MESSAGES | | | |--en.mo | | |--zh # 中

  • Python中用pyinstaller打包时的图标问题及解决方法

    前言 因为昨天重新研究了下python的打包方法,今天一番准备把之前写的一个pdf合并软件重新整理一下,打包出来. 但在打包的过程中仍然遇到了一些问题,半年前一番做打包的时候也遇到了一些问题,现在来看,解决这些问题思路清晰多了,这里记录下. 问题 打包成功,但运行时提示Failed to execute script xxx.这里又分很多种原因,这时不要用-w打包,然后在终端.\xxx.exe的方式运行,就可以看到输出日志了. 原因一 D:\02-python\2019-09-30_pdf_op

  • python 利用Pyinstaller打包Web项目

    最近需要用python打包一个单页面网页demo,于是准备用python包pyinstaller来打包程序.网上搜索了一下,大部分教程都是打包非web项目,这里分享一下打包简单网页demo的过程. 系统环境:win10+python3.6 一.安装pyinstaller pip install pyinstaller 二.打包项目 1.如果是单文件项目,pyinstaller可以通过简单的命令进行python代码的打包工作,其命令为: pyinstaller -option ***.py 1.1

  • 如何对Python编译PyInstaller打包生成的exe文件进行反编译生成pyc、py源代码文件

    目录 准备工作 根据exe生成pyc文件 根据pyc文件反编译为py文件 参考 总结 准备工作 没有加壳的python编译并打包的exe文件 python反打包代码(不知道这样叫是否合理):python-exe-unpacker 16进制编辑查看器 :Hex Editor Neo 反编译库 :uncompyle6 根据exe生成pyc文件 下载并解压缩 python-exe-unpacker 代码,myfile.exe为需要反编译的exe文件 使用python运行 python-exe-unpa

  • python pyinstaller打包exe报错的解决方法

    今天用python 使用pyinstaller打包exe出现错误 环境pyqt5 + python3.6 32位 在导入pyqt5包之前加上如下代码 import sys import os if hasattr(sys, 'frozen'): os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH'] from PyQt5.QtWidgets import QApplication, QMainWindow from py

  • 解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

    解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题 最近写一个小脚本,源代码200多行,引入了 openpyxl.requests库,写完打包exe之后居然有64MB的大小,真是奇了葩了.网上查找各位大神的做法,自己又动手填了N个坑之后,总算找到缩小exe文件的方法了,这种方法必须使用到pipenv,详细记录如下: 1.安装pipenv 就像安装其他python库一样,在cmd环境下安装: pip install pipenv 2.安装完成后,随便找一个盘符,在这个

  • pyinstaller将含有多个py文件的python程序做成exe

    1.尽量将资源文件夹放到主文件夹下 2.pyi-makespec main.py 制作spec文件 3.spec文件在当前文件夹下,main.spec 编辑spec文件 # -*- mode: python -*- block_cipher = None a = Analysis(['main.py', 'monitor.py',   'E:\\py_project\\test_wpf_python_msg\\src\\recognition_module\\caption_recognizer

  • python3.9实现pyinstaller打包python文件成exe

    简述 1.python python作为一门解释型脚本语言,它有三种发布方式: 文件 : 源码文件,运行需要使用者安装Python环境并且安装依赖的各种库 pyc文件:pyc文件是Python解释器可以识别的二进制码,可跨平台的,需要使用者安装相应版本的Python和依赖库. 可执行文件:不需要安装python环境和依赖库,可针对不同平台需要打包不同的可执行文件(Windows,Linux,Mac,-) 2.pyInstaller PyInstaller工具可以把python解析器和脚本打包成一

  • python使用Pyinstaller如何打包整个项目

    目录 使用Pyinstaller打包整个项目 1 .安装Pyinstaller 2. 打开命令窗口 3. 生成 spec文件 4. 打开生成的spec文件 5. 执行spec文件,在命令行输入 6.生成中出现的问题 使用pyinstaller打包pytorch踩的那些坑 问题1:单个文件打包还是文件夹打包? 问题2:一起打包的数据文件找不到? 问题3:GPU训练的模型要放到CPU环境跑? 问题4:直接打包还是用spec文件配置? 总结 使用Pyinstaller打包整个项目 今天真的被Pyins

  • python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件

    本文介绍一个exe打包工具pyinstaller,使用非常简单.方便,而且还跨平台. 软硬件环境 Windows 10 64bit PyQt5 Anaconda with python 3.6.5 pyinstaller apscheduler sqlalchemy pyinstaller安装 命令行中执行 pip install pyinstaller pyinstaller打包exe 示例还是以之前的为例,解压进入工程目录,命令行执行打包命令 pyinstaller -F --distpat

随机推荐