【python】打包神器--pyinstaller

  • 1:简介
    • pyinstaller是一个python的第三方库,它能够在Windows、Linux、 Mac OS 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Python 的环境中运行,也可以作为一个独立文件方便传递和管理。在Windows上使用就打包成.exe文件。在Mac上使用就打包成mac app。

    • 在Windows中打的包,只能在Windows中使用,在Mac中打的包只能在Mac中使用

    • 最好配合虚拟环境使用

- 环境crm
	- python.exe
	- Scripts
		- pip.exe
		- pyinstaller.exe
	- Lib
		- site-package
			- requests
			- flask
			- pyinstaller
  • 2.多文件打包
    • 2.1:安装pyinstaller,pip install pyinstaller
    • 2.2:写一个简单脚本
import requests

pram = {
    'query':"哈哈",
}
url = 'https://www.sogou.com/web'

response = requests.get(url=url,params=pram)
page_text = response.text
print(page_text)

input('按回车键结束任务.....')
  • 2.3:终端执行,pyinstaller -D demo.py,执行完成后,会生成下面几个文件,dist文件夹下,就会生成我们需要的exe执行文件

  • 2.4:执行结束后,将dist下面的文件打包给其他人,直接点击可执行文件即可执行。

  • 3.单文件打包

    • 3.1:上面的打包,会生成很多文件,dist下面的所有文件必须一起打包给别人才能执行,这样比较麻烦,如果能够打包成一个可执行文件,就会更方便了。
    • 3.2:终端执行,pyinstaller -F demo.py
    • 3.3: 注意,**打包成一个文件,并不代表只是单独的一个文件,当我们执行程序时,也会临时生成多个文件,只是执行完就删除了,我们无感知
  • 4.路径问题,如果我们的代码需要依赖其它文件,处理方法

    • 4.1:多文件打包
      • 4.1.1:代码及依赖文件
import requests
import os

pram = {
    'query':"哈哈",
}

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
with open(os.path.join(BASE_DIR, "info.txt")) as f:
    data = f.read()
url = data.strip()

response = requests.get(url=url,params=pram)
page_text = response.text
print(page_text)

input('按回车键结束任务.....')


- 4.1.2:打包后,直接将依赖文件放到 _internal文件夹中

  • 4.2:单文件打包
    • 4.2.1:单文件打包后,无论怎么放置依赖文件都不行,看下面的报错信息,这就是我们上文所提到的临时目录,这里找不到info.txt所以报错
    • 4.2.2:这里有几种解决方法
      • 1):取巧,将依赖文件放置到D盘固定目录下,脚本中也修改为固定路径,缺点:数据与代码分开,不便于管理
      • 2):sys.argv[0]表示代码本身文件路径
        • 修改路径:BASE_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))
        • 打包后,将依赖文件放到可执行文件同目录即可
      • 3):frozen,打包后,依赖文件放置到可执行文件同目录也可以正常执行
import sys
if getattr(sys, 'frozen', False): # True
    print('running in a PyInstaller bundle')   # 使用pyinstaller执行
else: # False
    print('running in a normal Python process')    # python正常的文件
import sys
import requests
import os

pram = {
    'query':"哈哈",
}
# BASE_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))
if getattr(sys, 'frozen', False):
    # pyinstaller打开
    BASE_DIR = os.path.dirname(sys.executable)
else:
    # py文件路径
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# https://www.sogou.com/web
with open(os.path.join(BASE_DIR, "info.txt")) as f:
    data = f.read()
url = data.strip()

response = requests.get(url=url,params=pram)
page_text = response.text
print(page_text)

input('按回车键结束任务.....')
  • 5.基于反射的动态模块加载
    • 5.1:目录及脚本
    • 5.2:这里我们在打包时,pyinstaller是不可能自动帮你选择模块的
    • 5.3:打包
    • 5.4:基于配置文件打包,第3步中打包后,删除其它文件,保留spec文件即可


    • 5.5:运行
posted @ 2024-09-06 22:47  Tony_xiao  阅读(25)  评论(0编辑  收藏  举报