将python程序打包成exe的pyinstaller

将python程序打包成exe

打包成exe需要安装第三方库:
pip install pyinstaller
安装完成,cmd中输入pyinstaller回车查看是否安装成功;

注意事项

该库支持mac,windows的,需要注意的是使用mac打完的包只能在mac上运行,windows打完的包只能在windows运行

快速入门

第一个程序打包
demo8.py

import time

print('我是exe文件按哦')
te=input('请输入内容')
print(te)
time.sleep(3)

在该py文件的目录下使用cmd输入:
pyinstaller -D demo8.py
开始执行打包,打包完成后目录会生成build,dist,demo8.spec文件

  1. build是指打包过程中的临时文件,这个可以删除不影响
  2. dist是打包完成的项目目录, 进入后可以看到打包完成的demo8.exe文件,注意这里的文件都是不能删除的
  3. demo8.spec文件:这个是打包生成后的配置文件,如果打包过程中一些动态包,或者其他资源没有加入进来我们可以配置这个文件,使用这个文件进行打包

多文件打包

命令:pyinstaller -D demo8.py -n demo
其中-n的意思是打包后的exe文件名叫什么
-D打包后生成多个文件
上述快速入门使用的就是

单文件打包

命令:pyinstaller -F demo8.py -n demo
命令:pyinstaller -Fw demo8.py -n demo其中的-w就是设置执行后不展示cmd的黑窗口;

py文件中涉及到其他文件资源文件如何加载使用?

注意:如果是多文件打包,不会报错故不用处理,单文件打包会出现执行找不到资源文件问题,如下方代码
demo8.py

import time
with open('./xuxiriji.md','r',encoding='utf-8') as rf:
    ss=rf.read()
print(ss)
print('我是exe文件按哦')

te=input('请输入内容')
print(te)
time.sleep(3)

执行多文件打包运行:打完包后执行发现报错了,说找不到./xuxiriji.md文件,要将该文件和demo8.py文件放在一起即可;
执行单文件打包运行:如果写的相对路径还好,建议写成:

mm=os.path.dirname(os.path.realpath(sys.argv[0]))# 文件存放的目录
sd=os.getcwd()# 文件存放的目录

这样我们的目录就能保证文件可以找得到,将第三方资源文件放在和exe文件相同地方即可;有效的解决文件找不到的问题:
不能使用下方这种错误的方式

import os
import sys
ss=os.path.realpath(sys.path[0])# 获取的是项目执行目录
base=os.path.dirname(os.path.abspath(__file__))# 获取的是项目执行目录

这个获取的项目执行目录!

官网的实例

在官网也提供了解决该场景的问题
演示代码

import os
import sys
if getattr(sys,'frozen',False):
    Base=os.path.dirname(sys.executable) # 文件执行时的路径
else:
    Base=os.path.dirname(os.path.abspath(__file__))# 文件所在的路径

动态加载第三方包

演示代码
demo8.py

import time
import importlib

print('dddddd')
card=importlib.import_module('headers_from.dd')
print(card.mm)
time.sleep(5)

我们再使用刚才的命令打包执行,结果会发现报错,说第五行找不到该包
Failed to execute script 'demo8' due to unhandled exception!
,所以解决此问题我们可以修改打包的配置文件
也就是demo8.spec文件
打开这个文件
在这个字段中增加要添加的第三方库:hiddenimports

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


block_cipher = None


a = Analysis(
    ['demo8.py'],
    pathex=[],
    binaries=[],
    datas=[],
    hiddenimports=[
    "headers_from.dd",
    ],
    hookspath=[],
    hooksconfig={},
    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,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='demo8',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)

再次打包使用的命令pyinstall demo8.spec回车执行打包啦,注意此时就不需要加-D或者-F了;
生成出来的icon设置,-i指定图标目录即可
其他命令详见pyinstaller的官方文档

如果想让其他资源(图片,视频,文档等)也打包在exe中可以设置资源,但这也就会造成exe很大

# -*- mode: python -*-

block_cipher = None

resources = (("inspurer.db", "."), ("dlib_face_recognition_resnet_model_v1.dat", "."),
 ("shape_predictor_68_face_landmarks.dat", "."), ("close_logcat.png", ".")
 , ("open_logcat.png", "."), ("finish_register.png", "."), ("new_register.png", ".")
 , ("start_punchcard.png", "."), ("end_puncard.png", "."), ("index.png", "."))

a = Analysis(['workAttendanceSystem.py'],
             pathex=['C:\\Users\\lenovo\\Desktop\\test\\python'],
             binaries=[],
             datas=resources,
             hiddenimports=[],
             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='workAttendanceSystem',
          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,
               name='workAttendanceSystem')

上面还有个变量block_cipher,主要是防止exe被反编译。
可以设置

block_cipher = pyi_crypto.PyiBlockCipher(key='123456789')

加密的详细查看
Python 中如何安全地进行编译和反编译? (qq.com)

更多配置参考官网:Using Spec Files — PyInstaller 5.4.1 documentation

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容