打包

打包

# 安装
pip install pyinstaller

1.exe打包

  • 支持,win/mac

    • win 平台上只能打windows的包;
    • mac 上只能打出 mac 的程序;
  • 一般打包的时候结合虚拟环境进行打包;

  • 项目开发步骤

    • 创建虚拟环境

    • 开发 。。。

    • # 开发完毕
      pip freeze > requirements.txt
      
    • 如果是其他平台的需求,安装虚拟机(mac),导入依赖包

      pip install -r requirements.txt
      
    • 打包

      Pyinstaller -F xxxx
      
    • 产出 demo.exe;

    • 注意:如果不需要跨平台,可以直接进行打包;

  • 命令总览

    image-20220415140110875

2.多文件打包

说明:多文件打包指的是生成多个文件;

# 命令
pyinstaller -D app.py

image-20220415111611025

3.单文件打包

说明:单文件打包指的是生成单个文件;

# 命令
pyinstaller -F app.py

image-20220415133428754

dist目录下仅一个文件,为app.exe;

image-20220415135140267

4.文件路径

使用多文件进行打包,并使用- n指定名称;

image-20220415135848602

import time
text=input("请输入>>>")
print(text)
with open('account.txt','r',encoding='utf8')as fp:
    data=fp.read()
print(data)

使用改方法的时候,执行的时候会报错,因此我们需要使用os模块进行抽取,也可以实现代码的解耦,实现开闭原则。

BASE_DIR=os.path.dirname(os.path.abspath(__file__))

# v=os.path.abspath(__file__) # 获取脚本文件所在的物理路径 >>> E:\newpythoncode\bilibili\app.py
print(BASE_DIR) # E:\newpythoncode\bilibili 
# dirname:去掉文件名,返回上级目录

修改原来的程序

备注:当程序出现错误的时候会直接进行终止程序,强行退出;

import time
import os

BASE_DIR=os.path.dirname(os.path.abspath(__file__))

text=input("请输入>>>")
print(text)
# 使用os.path.join()进行拼接。
with open(os.path.join(BASE_DIR,'account.txt'),'r',encoding='utf8')as fp:
    data=fp.read()
print(data)

多文件打包时一般不报错。

单文件打包时会报错,因为单文件打包的文件执行的时候会将程序进行解压。随后会在解压的(运行时的临时目录)文件中进行寻找;

import sys

print(sys.argv)
>>> ['E:/newpythoncode/bilibili/test.py'] 
# sys.argv[0]   'E:/newpythoncode/bilibili/test.py'

image-20220415145220642

输出 python 解释器后的目录,打包后表示 exe 文件的所在文件;

import sys
import os

print(sys.argv[0])
# realpath() 找到当前路径的绝对路径
print(os.path.realpath(sys.path[0]))

image-20220415145936638

补充:

image-20220416094426801

使用上述过程依旧报错,可能是由于版本等问题,此时可以在配置文件中进行修改,然后重新打包;

点击查看 : 参考文章

datas=[
    ('account.txt','.')# 文件名,后面猜测是相对的路径;
]
# 执行命令
pyinstaller -D 哈哈哈.spec
# >>> 生成目录中会直接包含文件

image-20220416095136045

运行成功

image-20220416095357226

5.导入自定义包

导包一般有两种情况 : 普通导包动态导入

5.1 默认导入

image-20220415163946993

说明:在导包的时候不管是直接导入的,还是间接(导入包中的导入)都会直接进行导入;不会出现异常;

5.2 动态导入

import importlib

# from utils.db import get_db
from utils.encrypted import md5

print("------开始执行--------")
pk=importlib.import_module("utils.db") 

res=pk.get_db()
print(res)
data=md5()
print(data)

input("按回车键退出>>>")

说明:此导入包的方式一般会结合这反射进行使用,从而使得 python 的配置文件更好的遵循开闭原则,从而降低代码之间的耦合度。

image-20220415165855155

此时会报错,因为动态导入的时候就需要识别程序,所以我们可以在配置文件哈哈哈.spec中进行手动添加。

image-20220415170514534

# 执行命令
pyinstaller -D 哈哈哈.spec # 自己需要指定配置文件;

image-20220415170749433

配置后正常运行。

6.补充

  • 生成图标

    # 需要 img.ico 文件
    # 指定文件的路径即可
    pyinstall -i img.ico -n name -w -D main.py
    

    其他的功能的添加可以参考命令中的提示!

  • 说明

    打包,最常用于是打包桌面程序(pyqt5),控制台程序一般很少使用;

    控制台一般用于某些脚本的执行,例如,爬虫脚本,直接交给用户运行即可;

大江东去,浪淘尽,千古风流人物。

posted @ 2022-04-16 10:04  紫青宝剑  阅读(376)  评论(0编辑  收藏  举报