先上spec文件配置好后的全部代码。后面详细讲解!
官方详细文档请参阅链接

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

block_cipher = None

a = Analysis(['hello.py'],
             pathex=['D:\\Company\\project\\untitled',
             'D:\\Company'
             ],
             binaries=[( '/usr/lib/libiodbc.2.dylib', '.' )],
             datas=[
			('image/*.png','data/image'),
			('pdf/*.pdf','data/pdf')
			],
             hiddenimports=[
             'sklearn.utils._typedefs'
             ],
             hookspath=[],
             runtime_hooks=[],
             excludes=['PyQt5'],
             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,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='hello',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False )

项目路径

D:\Company为主目录,下面有2个文件夹project和util
project目录下放了项目文件untitled
util目录下放自己写的库/模板

0. a里面的script

['hello.py']

main文件入口,或者你执行文件的时候要执行多少个python文件,那就写几个,比如pyinstaller hello.py hello2.py,会依次去执行

1. a里面的pathex

pathex=['D:\\Company\\project\\untitled',
        'D:\\Company'
       ],

意思是项目需要从什么地方导入自定义库

# hello.py文件
from mypath.util import module1  # 从D:\\Company\\project\\untitled找到mypath文件夹下面的util下面的module1
from util.module2 import *  # 从D:\\Company目录下的util找到module2

2. a里面的datas

项目需要用到什么数据,比如图片,视频等。里面格式为tuple,第一个参数是文件路径,第二个是打包后所在的路径。
下面的代码意思就是,把image下面的所有以png结尾的文件打包到exe所在目录下的data/image目录下。把pdf目录下的test.pdf文件打包到exe所在目录的data/pdf目录下。

datas=[
	('image/*.png','data/image'),                        
	('pdf/test.pdf','data/pdf')
],

3. a里面的hiddenimports

hiddenimports=[
	'sklearn.utils._typedefs'
],

官方解释

Normally PyInstaller learns about .so and .dll libraries by analyzing the imported modules. Sometimes it is not clear that a module is imported; in that case you use a --hidden-import command option. But even that might not find all dependencies.

假如打包后打开exe显示module not found,就要把该库添加到hiddenimports里面了。

4. a里面的binaries

动态库

binaries=[( '/usr/lib/libiodbc.2.dylib', '.' )],

5. a里面的excludes

excludes=['PyQt5']

假如你用的python有很多库,但是你不需要用到某个,那么就把它添加到里面去,比如很多人没有用到PyQt5, pandas

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐