关于pyinstaller打包python脚本问题

python文件使用pyinstaller打包的问题

常用pyinstaller相关命令

文件整体打包, 会自动打包相关依赖

pyinstaller -F file 

分文件打包,只打包单个文件,其他文件作为依赖

pyinstaller -D dir

Windows和Mac OS X:不为标准i/o提供控制台窗口

pyinstaller -F file -w

详细见:pyinstaller官方文档

pyinstaller exe文件与本地文件调试区分

exe文件默认是在Windows的用户目录下的temp目录中,而本地调试时则是本文件,因此为了方便调试可通过以下方式实现:

# 程序打包成exe的时,会将一个变量frozen注入到sys中,这里使用判断,检测sys是否有frozen这个变量,
# 如果有,就使用sys._MEIPASS访问临时文件夹路径,
# 如果没有,就使用当前路径,当程序不管是以PyInstaller打包后形式运行,还是本地测试,都能找到正确的资源路径。
import sys
if getattr(sys, "frozen", False):
    # exe
    pass
else:
    # file
    pass

pyinstaller添加静态资源问题

在我们使用pyinstaller进行打包时,可能会需要将一些文件或者可执行文件打包进我们的可执行文件中,这就需要使用到pyinstaller的打包静态资源的功能,目前有两种方式。

  1. 在打包时添加命令参数的方式,使用--add-data参数,后面添加需要添加的静态资源,格式为本地路径:打包成exe后的文件,需要注意的是在Linux下符号为:,windows环境下则为;,示例如下
pyinstaller --add-data './src/README.txt:src' myscript.py
  1. 使用spec文件进行打包,我们在使用pyinstaller进行打包的过程中,一般会在当前目录生成一个*.spec的文件,我们只需要修改其中的部分内容(datas参数)即可,和上述命令行参数类似,使用元组包裹,添加到一个列表中,修改内容如下:
a = Analysis(
    ['myscript.py'],
    pathex=[],
    binaries=[],
    datas=[("./src/README.txt", "src")],

做完了上述内容,还需要修改我们打包成可执行文件后的静态资源的引用路径,区分方式见上方pyinstaller exe文件与本地文件调试区分, 对于路径我们需要修改为打包后的可执行文件的路径,对于pyinstaller来说,在执行包含静态资源的可执行文件时,会在tmp目录下生成对应的临时文件,当然,静态资源也在其中,我们只需要获取到那个临时文件的位置就可以了,以上述的静态资源为例

import os
import sys
if getattr(sys, "frozen", False):
    # exe
    README_PATH = os.path.abspath(os.path.join(sys._MEIPASS, "src", "README.txt"))
else:
    # file
    pass

sys._MEIPASS可以获取到临时文件夹,然后根据我们之前指定的文件夹拼接即可

posted @   形同陌路love  阅读(226)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示