利用pyinstaller打包Python项目包含多个文件夹

Posted 雨之夜&秋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用pyinstaller打包Python项目包含多个文件夹相关的知识,希望对你有一定的参考价值。

  最近用Python给媳妇写了两个小项目,给解决了她的每天重复的一些人工操作。媳妇很开心,但是问题来了,她是个Python小白,对她来说,需要安装配置Python环境和一大堆第三方模块是个麻烦事儿。而且后续把这些工作交接给别人的话,一是又需要重新安装Python环境,二是我辛苦给她写的源码就这样暴露了。

  为了解决这个问题,于是就开始百度。果然Python还是有好多中加密源码的方法,并且可能打包成exe的可执行文件。这样不仅保护了源码的安全,还免去了安装Python环境的繁琐。

最开始试了是py2exe这个模块,花了两个小时,还是没倒腾成功,百度查了说py2exe不是很好用,我也果断放弃了,尝试别的方法。然后就有了pyinstaller的经历。百度上有不少文档,但还是得自己去真正操作一遍才行。那我们就开始吧。

  首先是安装pyinstaller模块,这个很简单,直接pip install pyinstaller就行了。我们就重点讲讲怎么用吧。先从最简单的开始。。。。

  写个简单的脚本holle.py,为什么要在脚本的最后加上了time.splee(5)?因为生成的exe文件执行太特么快了,我都没看见打印了什么就自动关闭docs窗口了。

# -*- coding: utf-8 -*-
#2019/12/25 14:24

import time
print(\'#######################################################################################\')
print(\'#######################################################################################\')
with open(\'123.txt\',\'r\') as f:
    ret = f.read()
    print(ret)

print(\'#######################################################################################\')
print(\'#######################################################################################\')
print(\'#######################################################################################\')
time.sleep(5)
hello.py

这里简单介绍一下pyinstaller的参数使用:

-h,--help查看该模块的帮助信息
-F,-onefile 产生单个的可执行文件
-D,--onedir 产生一个目录(包含多个文件)作为可执行程序
-a,--ascii 不包含 Unicode 字符集支持
-d,--debug 产生 debug 版本的可执行文件
-w,--windowed,--noconsolc 指定程序运行时不显示命令行窗口(仅对 Windows 有效)
-c,--nowindowed,--console 指定使用命令行窗口运行程序(仅对 Windows 有效)
-o DIR,--out=DIR 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件
-p DIR,--path=DIR 设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径
-n NAME,--name=NAME 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字

在表 1 中列出的只是 PyInstaller 模块所支持的常用选项,如果需要了解 PyInstaller 选项的详细信息,则可通过 pyinstaller -h 来查看。

打开终端,进入到hello.py的所在目录,执行 pyinstaller -F hello.py。执行完会自动生成build、dist目录和hello.spec文件。

咱要的exe文件在dist目录下,其他的就没有用了。直接把dist目录下的 hello.exe文件拷贝到其他地方,比如桌面,哈哈。然后在桌面创建一个123.txt文件,随便写点什么。主要测试一下exe能否正常执行,有没有打印预期的内容。试了一下,不错。是预期的效果。那接下来就可以开始我们的正题了。打包多个目录下的多个py文件。

代码目录结构如下:

1、先生成spec文件

 打开Terminal,进入到bin目录下,执行pyinstaller -D run.py,还是一样执行完会自动生成build、dist目录和run.spec文件。让我们来看看spec文件长啥样。

 

 

 2、配置spec文件

因为项目里写了好多自定义的模块,以及应用的图片和模板文件。所以需要配置一下spec文件,才能正确的生成exe文件。

主要配置以下4个地方即可:

 

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

SETUP_DIR = \'E:\\\\python_test\\\\python\\\\lixiaoxin_barcode2\'

a = Analysis([\'run.py\',
            \'E:\\\\python_test\\\\python\\\\lixiaoxin_barcode2\\\\core\\\\main.py\',
            \'E:\\\\python_test\\\\python\\\\lixiaoxin_barcode2\\\\conf\\\\settings.py\',
            \'E:\\\\python_test\\\\python\\\\lixiaoxin_barcode2\\\\core\\\\barcode_handler.py\',
            \'E:\\\\python_test\\\\python\\\\lixiaoxin_barcode2\\\\core\\\\log.py\'],
             pathex=[SETUP_DIR],
             binaries=[],
             datas=[(SETUP_DIR + \'\\\\db\\\\input\',\'db\\\\input\'),(SETUP_DIR + \'\\\\doc\',\'doc\')],
             hiddenimports=[\'core\',\'core.main\',\'conf.settings\',\'core.log\',\'core.barcode_handler\'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name=\'run\',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name=\'run\')
run.spec

 

(1) py文件打包配置

  针对多目录多文件的python项目,打包时候需要将所有相关的py文件输入到Analysis类里。Analysis类中的pathex定义了打包的主目录,对于在此目录下的py文件可以只写文件名不写路径。如上的spec脚本,将所有项目中的py文件路径以列表形式写入Analysis,这里为了说明混合使用了绝对路径和相对路径。

(2) 资源文件打包配置

  资源文件包括打包的python项目使用的相关文件,如图标文件,文本文件等。对于此类资源文件的打包需要设置Analysis的datas

比如:datas=[(SETUP_DIR + \'\\\\db\\\\input\',\'db\\\\input\'),(SETUP_DIR + \'\\\\doc\',\'doc\')],只需要添加依赖的输入目录以及放图片、模板的目录即可。
注意:SETUP_DIR + \'\\\\db\\\\input\'为源码中的绝对路径,Windows路径需要用\\\\来转义,后面的db\\\\input为打包后生成的目录,写相对路径即可。这样我们就不需要再手动把依赖的文件拷贝到run目录了

(3)Hidden import配置

  pyinstaller在进行打包时,会解析打包的python文件,自动寻找py源文件的依赖模块。但是pyinstaller解析模块时可能会遗漏某些模块(not visible to the analysis phase),造成打包后执行程序时出现类似No Module named xxx。这时我们就需要在Analysis下hiddenimports中加入遗漏的模块。
如:

from core.barcode_handler import *
from conf import settings as ss
from core.log import Log as log
只需要写入自定义的模块即可
hiddenimports=[\'core\',\'core.main\',\'conf.settings\',\'core.log\',\'core.barcode_handler\']

 

3、配置好spec文件后,重新生成exe文件。

可以把之前生成的build和dist目录删除掉,只留刚配置好的run.spec文件就行。

最后打开Terminal,进入到bin目录下,执行pyinstaller -D run.spec,一样会生成build和dist目录,我们只要dist目录就行了。

 

 可以把dist目录拷贝到桌面测试一下。为了方便操作,可以创建一个run.exe和输入、出入目录的快捷方式放到根目录下,dist目录可以任意命名。

 

 执行一下看看效果:

 

 

 

 不错,程序运行正常。

 最后总结起来就三步:

1、先执行pyinstaller xxx.py生成xxx.spec文件

2、配置xxx.spec文件

3、执行pyinstaller -D xxx.spec

最后:如果生成了exe文件,但是双击xx.exe执行没有效果,又看不到报错信息的话,可以在Terminal或者cmd里执行

 参考博客:https://blog.csdn.net/weixin_42052836/article/details/82315118

 

以上是关于利用pyinstaller打包Python项目包含多个文件夹的主要内容,如果未能解决你的问题,请参考以下文章

python使用pyinstaller打包项目文件

Python利用pyinstaller工具将py文件打包成.exe可执行文件

Linux下,Python项目包含多个模块以及图片包,跪问如何用pyinstaller将其打包在一起?

利用pyinstaller 打包Python文件

python利用pyinstaller打包生成exe

包含多个文件夹的Python项目打包为可执行文件exe