pyinstaller利用spec文件打包的使用模板

本文介绍了如何使用PyInstaller的spec文件打包Python项目,包括将资源文件集成到单个可执行文件或创建免安装绿色文件夹,以及提供模板和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pyinstaller打包

使用pyqt5开发软件,当项目越来越大,引用的资源越来越多时,那么使用pyinstaller进行打包,如果不利用spec文件,是很难满足打包需求的。
spec文件,其实你在使用 pyinstaller main.py打包时 ,也是会自动生成的,叫main.spec。
不过,如果你想把自己的资源文件一起打进包去,则需要对spec文件进行一些编辑,然后使用 pyinstaller main.spec即可打包完成。
pyinstaller 基础常规打包方法,网上文章很多了,大家自己搜索也是一大堆,就不一一列举了。这里推荐一篇,刚学习使用pyinstaller时对我帮助最大的文章,同时在此对这位大神作者表示感谢。
《pyinstaller的使用python 打包程序》
本文主要就是列举下pyinstaller利用spec文件进行打包的几个使用模板,以供大家参考使用。至于内涵原理,本人时间有限,也没深入研究,大家根据自己情况去探索吧。
【如下代码,完全复制,直接运行,即可使用】
【注1:模板中的相关路径和文件名称,当然需要根据自己的情况对应修改了】
【注2:如果你的spec文件叫main.spec的话,打包命令便是 pyinstaller main.spec
【注3:当项目越来越大时,免安装绿色文件夹 在软件启动速度上,比单个可执行文件,要快!**】

模式一:使用spec文件,打成【单个可执行文件】
# -*- mode: python -*-

block_cipher = None


a = Analysis(['main.py'],
             pathex=['D:\\PythonProject\\mysoft'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
             



#######!!!注意点1:加载自己的资源文件#####################
def extra_datas(mydir):
    def rec_glob(p, files):
        import os
        import glob
        for d in glob.glob(p):
            if os.path.isfile(d):
                files.append(d)
            rec_glob("%s/*" % d, files)
    files = []
    rec_glob("%s/*" % mydir, files)
    extra_datas = []
    for f in files:
        extra_datas.append((f, f, 'DATA'))

    return extra_datas

# append the 'Resources' dir
a.datas += extra_datas('Resources')    ###这里是自己的资源文件夹       
a.datas += extra_datas('Reports')     ###这里是自己的资源文件夹
a.datas += extra_datas('Drivers')    ###这里是自己的资源文件夹
################################################
             
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)

             
exe = EXE(pyz,
          a.scripts,
          a.binaries,                          ###!!!注意点2
          a.zipfiles,                          ###!!!注意点2
          a.datas,                             ###!!!注意点2
          [],
          exclude_binaries=False,   ###!!!注意点3:这里是False
          name='mysoft',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False,
          icon='d:\\mysoft.ico')
模式二:使用spec文件,打成【免安装绿色文件夹】
# -*- mode: python -*-

block_cipher = None


a = Analysis(['main.py'],
             pathex=['D:\\PythonProject\\mysoft'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
             



#######!!!注意点1:加载自己的资源文件#####################
def extra_datas(mydir):
    def rec_glob(p, files):
        import os
        import glob
        for d in glob.glob(p):
            if os.path.isfile(d):
                files.append(d)
            rec_glob("%s/*" % d, files)
    files = []
    rec_glob("%s/*" % mydir, files)
    extra_datas = []
    for f in files:
        extra_datas.append((f, f, 'DATA'))

    return extra_datas

# append the 'Resources' dir
a.datas += extra_datas('Resources')  ###这里是自己的资源文件夹     
a.datas += extra_datas('Reports')    ###这里是自己的资源文件夹 
a.datas += extra_datas('Drivers')    ###这里是自己的资源文件夹 
################################################
             
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)

             
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,   ###!!!注意点3:这里是True
          name='mysoft',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False,
          icon='d:\\mysoft.ico')


coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='mysoft')
模式三:使用spec文件,同时打出【单个可执行文件】和【免安装绿色文件夹】
# -*- mode: python -*-

block_cipher = None


a = Analysis(['main.py'],
             pathex=['D:\\PythonProject\\mysoft'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
             



#######!!!注意点1:加载自己的资源文件#####################
def extra_datas(mydir):
    def rec_glob(p, files):
        import os
        import glob
        for d in glob.glob(p):
            if os.path.isfile(d):
                files.append(d)
            rec_glob("%s/*" % d, files)
    files = []
    rec_glob("%s/*" % mydir, files)
    extra_datas = []
    for f in files:
        extra_datas.append((f, f, 'DATA'))

    return extra_datas

# append the 'Resources' dir
a.datas += extra_datas('Resources')  ###这里是自己的资源文件夹 
a.datas += extra_datas('Reports')    ###这里是自己的资源文件夹 
a.datas += extra_datas('Drivers')    ###这里是自己的资源文件夹 
################################################
             
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)


exe1 = EXE(pyz,
          a.scripts,
          a.binaries,                          ###!!!注意点2
          a.zipfiles,                          ###!!!注意点2
          a.datas,                             ###!!!注意点2
          [],
          exclude_binaries=False,   ###!!!注意点3:这里是False
          name='mysoft',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False,
          icon='d:\\mysoft.ico')

             
exe2 = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,   ###!!!注意点3:这里是True
          name='mysoft',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False,
          icon='d:\\mysoft.ico')


coll = COLLECT(exe2,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='mysoft')

参考:
https://blog.csdn.net/liaozp88/article/details/131817361?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-4-131817361-blog-53327262.235v40pc_relevant_anti_t3_base&spm=1001.2101.3001.4242.3&utm_relevant_index=7

### 使用 PyInstaller 打包文件 Python 项目为单个 EXE 文件 对于多文件Python 项目,可以利用 `--onefile` 参数来创建单一可执行文件。此参数告知 PyInstaller 将所有的依赖项都压缩到同一个 exe 中,在运行时解压至临时目录并执行[^2]。 #### 准备工作 确保已经安装了最新版本的 PyInstaller。如果尚未完成安装,则可以通过如下命令来进行操作: ```bash pip install --upgrade pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple ``` #### 编写 spec 文件 (推荐方式) 为了更好地控制打包过程以及处理复杂的项目结构,建议先生成 `.spec` 配置文件再进行编译。这允许更精细地调整资源嵌入、图标设置等问题。通过下面这条指令自动生成适合当前项目的配置模板: ```bash pyi-makespec --onedir --windowed --icon=your_icon.ico main.py ``` 这里 `-w` 表示无控制台窗口启动;`--icon` 后面接的是应用程序图标的路径;而 `main.py` 是入口脚本的名字。注意这里的 `--onedir` 可以替换为 `--onefile` 来制作单独的 .exe 文件[^3]。 编辑生成好的 `.spec` 文件中的数据部分,加入其他必要的源码文件或资源文件作为二进制形式的数据附加进去。例如: ```python a = Analysis(['main.py', 'helper_module.py'], ...) data_files=[('resources', ['res1.txt', 'res2.png'])], ... ``` 最后使用修改后的 `.spec` 文件构建最终的应用程序: ```bash pyinstaller your_project_name.spec ``` #### 直接命令行打包 (简易方法) 如果不希望通过编写 `.spec` 文件的方式,也可以直接尝试简单的命令行选项来快速打包整个工程为一个 exe 文件。但是这种方式可能无法很好地解决一些复杂情况下的依赖关系管理问题。 ```bash pyinstaller --onefile --add-data "path_to_additional_file;destination_folder" --hidden-import module_name main.py ``` 上述命令中 `--add-data` 用于指定额外需要被打包进入目标 exe 的静态资源位置及其相对输出路径;`--hidden-import` 则用来声明那些未被自动检测出来的隐含导入模块名称。 #### 注意事项 - 如果遇到缺少某些库的情况,可能是由于这些库不是纯 Python 实现或者是动态加载的结果。此时应该查阅官方文档了解具体解决方案。 - 对于图形界面应用来说,记得加上 `-w` 或者 `--noconsole` 开关去除黑框显示。 - 当涉及到外部资源(比如图片、字体等),务必确认它们已经被正确添加到了打包过程中去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值