目录

前言

纯Python代码的打包

包含其他文件的打包

总结


前言

相比于cx-freeze和Nuitka,还是pyinstaller好用些,因此使用pyinstaller来生成独立的exe文件以供其他工程师使用。项目中用到pytest来管理整个自动化测试用例,所以本文针对于pytest项目来进行pyinstaller的打包说明。

我的pytest项目结构如下所示:

- sgh_universal_test_automation
  - products (folder)
    - product_x.apk
  - utils (folder)
  - testcases (folder)
    - solution (folder)
      - test_xxx.py (test case)
      - conftest.py (conf file)
  - main_for_xxx.py
  - pytest.ini

纯Python代码的打包

如果你的软件中只有.py文件,即Python代码文件,不包括图标、图片等资源文件,那么使用pyinstaller打包是非常简单的,往往只需要下面一行命令即可:

pyinstaller -F -w -i icon.ico main_for_xxx.py

当运行这个命令之后,会对应的生成一个main_for_xxx.spec文件,这个文件之后有用处。

其中的几个选项:
-F 把整个软件(包括依赖的各种库文件)打包成单一文件;也可以用-D代替,-D是生成一个文件夹,把所有的依赖项放入文件夹中
-w 禁止Windows的命令行窗口,一般来说先不要使用,以方便看错误在哪里发生
-i 生成的exe文件会带有这个图标;
最后的main_for_xxx.py就是翻译软件的入口程序

但其实这里面打包pytest项目有个坑,pytest项目一般都会用到一些插件,诸如pytest-html等,这些模块在pyinstaller打包过程中并不会自动导入,因此需要手动在spec文件中手动写入。

一般来说,pytest项目按照如下方式修改即可:

- numpy等可以根据实际情况看是否加入,主要是pytest相关的安装包

- C:/Python38/Lib/site-packages 路径请替换成自己的本地python路径

a = Analysis(
    ['main_for_xxx.py',],
    pathex=[],
    binaries=[],
    datas=[('C:/Python38/Lib/site-packages/pytest_html', './pytest_html'),
           ('C:/python38/Lib/site-packages/pytest_html-3.1.1.dist-info', './pytest_html-3.1.1.dist-info'),
           ('C:/Python38/Lib/site-packages/py', './py'),
           ('C:/Python38/Lib/site-packages/pytest', './pytest'),
           ('C:/Python38/Lib/site-packages/_pytest', './_pytest'),
           ('C:/Python38/Lib/site-packages/pytest_assume', './pytest_assume'),
           ('C:/python38/Lib/site-packages/pytest_assume-2.4.3.dist-info', './pytest_assume-2.4.3.dist-info'),
           ('C:/Python38/Lib/site-packages/pytest_metadata', './pytest_metadata'),
           ('C:/python38/Lib/site-packages/pytest_metadata-2.0.1.dist-info','./pytest_metadata-2.0.1.dist-info'),
           ('C:/Python38/Lib/site-packages/numpy', './numpy'),
           ('C:/python38/Lib/site-packages/numpy-1.22.3.dist-info', './numpy-1.22.3.dist-info'),],

其中,datas增加的内容实际上和pyinstaller --add-data命令起到的作用一样,以('C:/Python38/Lib/site-packages/pytest_html', './pytest_html')为例,元组第一个参数代表本地python site-packages库中的pytest_html文件夹,'./pytest_html' 代表pytest将该文件夹打包后存放的路径,相同的用add-data命令如下:--add-data="源地址;目标地址"

pyinstaller main_for_xxx.py --add-data "C:/Python38/Lib/site-packages/pytest_html, ;./pytest_html"

包含其他文件的打包

其实原理与之前说的在datas中添加资源文件类似,但是需要注意的事项多了一些。

第一步:仍然是在spec或命令行中通过--add-data来将需要的资源加入。例如项目中需要加入products文件夹下的product_x.apk。sepc文件中可以这么写:

a = Analysis(
    ['main_for_xxx.py',],
    pathex=[],
    binaries=[],
    datas=[...,

('products/product_x.apk','.'),]

'.' 意思是希望pyinstaller直接将apk文件打包放在TEMP根目录下。

第二步:根据spec的配置来调整代码中引用到apk文件的路径

当使用PyInstaller打包到单个文件时,运行.exe会将所有内容解压缩到TEMP目录中的文件夹中,运行脚本,然后丢弃临时文件。临时文件夹的路径会随着每次运行而更改,但对其位置的引用会添加到sys._MEIPASS中。
为了利用这一点,当Python代码读取任何也将打包到.exe中的文件时,需要更改位于sys._MEIPASS下的文件位置。换句话说,您需要将其添加到python代码中。
下面是一个示例,在打包为单个文件时,使用引用的链接中的代码将文件路径调整到正确的位置。

# myScript.py
import sys
import osdef resource_path(relative_path):""" Get absolute path to resource, works for dev and for PyInstaller """try:# PyInstaller creates a temp folder and stores path in _MEIPASSbase_path = sys._MEIPASSexcept Exception:base_path = os.path.abspath(".")return os.path.join(base_path, relative_path)def print_file(file_path):file_path = resource_path(file_path)with open(file_path) as fp:for line in fp:print(line)if __name__ == '__main__':print_file('data_files/data.txt')

利用这个resource_path函数将资源所在的路径找到,如果找到 _MEIPASS 路径就以此为资源的基准路径,否则以当前路径为基准路径。这样在exe文件运行时就不会报找不到资源的错误了。

总结

总体而言,pyinstaller相较于cx-freeze和Nuitka还是比较方便快捷的,但在打包pytest项目中可能遇到一些坑,在此记录一下,其他pyinstaller相关的一些知识可以参考如下的博客,个人认为比较全面:

pyinstaller系列之一:简介,安装及简单使用_MrWind灬的博客-CSDN博客

Pyinstaller 打包 Pytest项目及资源文件相关推荐

  1. Pyinstaller打包 Pytest+Allure成exe文件执行时,报error: unrecognized arguments: --count=1,--alluredir=result错

    Pytest+Allure是一款非常经典的测试框架,堪称完美!!!,但是有时候,我们在测试过程中,当自动化任务很多,需要部署很多的机器去跑工程时,我们又不希望去频繁的部署安装Python环境,所以大部 ...

  2. windows pyinstaller打包pytorch程序到exe文件

    主要内容 利用pyinstaller将pytorch代码打包成exe其实含有比较多大的坑,这篇文章主要记录最近在项目中打包exe遇到的一些问题,由于问题主要是opencv和pytorch带来的,解决的 ...

  3. IntelliJ IDEA 中的Java Web项目的资源文件复制新增如何更新到部署包中?

    文章目录 resources目录下的文件复制新增 webapp目录的文件复制新增 IntelliJ IDEA 中的Java Web项目的资源文件如果复制新增,正常的重新部署.重启服务器.update ...

  4. eclipse java读取文件_在eclipse完成对Java_web项目里面资源文件的读取

    Java_web项目的资源文件一般有两种: 一种是存放数据之间有联系的文件,使用xml文件 另一种是存放数据之间没有联系的文件,使用properties文件 这里我们对properties文件读写做示 ...

  5. webpack打包vue项目之后dist文件夹在本地跑起来

    webpack打包vue项目之后dist文件夹在本地跑起来 转载为:https://blog.csdn.net/u014054437/article/details/79981307 谢谢博主 亲测, ...

  6. 使用pyinstaller打包python_使用pyinstaller打包Python项目,python

    00 前言 上一篇文章写的是使用百度aip实现一个图片转文字的小工具( https://blog.csdn.net/George_Clancy/article/details/105551872 ), ...

  7. 用Pyinstaller打包Scrapy项目问题解决!!!

    这篇报废,这里的PyInstaller教程相信对大家会有用,其中会解决spider not found的问题,真正成功地打包Scrapy:https://blog.csdn.net/La_vie_es ...

  8. Pyinstaller打包Django项目

    1. 安装pyinstaller pip install pyinstaller 2. 介 绍 PyInstaller读取您编写的 Python 脚本.它会分析您的代码以发现您的脚本需要执行的所有其他 ...

  9. 以Jar形式为Web项目提供资源文件(JS、CSS与图片)

    一.背景 二.分析 1.把我需要的JS.CSS与图片等资源copy到Web工程中. 2.通过程序采用流的方式读取Jar中的资源流再输出到页面流. 三.分析结果 四.核心代码开发(Jar端) 1.org ...

最新文章

  1. android String.format
  2. qpython3l手机版安装第三方库总是报错_python编码问题在此终结
  3. Kotlin plugin should be enabled before ‘kotlin-android-extensions‘
  4. ubuntu 16.04下git的安装与使用
  5. python中;是什么意思_Python
  6. idea使用activiti插件
  7. codeforces 776C Molly's Chemicals(连续子序列和为k的次方的个数)
  8. 撸.NET Core的正确姿势
  9. C#程序加密工具.Net Reactor教程
  10. 朴素版prim算法求最小生成树
  11. Python库下载第三方镜像(清华/豆瓣)
  12. 2013年十大免费空间综合排行榜-稳定,可靠,速度快,可建站免费空间
  13. 在Linux上安装centos 7镜像详细步骤
  14. 哪些英文单词改变时态需要双写末尾字母
  15. 625线,525线什么意思?
  16. 十大报表工具 BI 产品深度点评-----BI报表行业专家干货分享----一文读懂报表与BI的行业现状----最新常用BI报表工具对比科普帖
  17. Matplotlib 箱线图
  18. springboot+shardingsphere温故而知新
  19. 微型计算机的外存储器 现在普遍采用什么,当前微型计算机上大部分采用的外存储器,不包含下列哪些?1.硬盘 2.光盘 3.软盘 4.磁带。...
  20. go设置后端启动_名企实习项目 | 后端开发岗go微服务实战项目启动,大牛导师带你拿offer!...

热门文章

  1. 全国二级C语言上机必读
  2. php 光速,光速 - 实验帮百科
  3. RabbitMQ-简单模式/工作模式(分发、应答、持久化、不公平分发、发布确认)
  4. 【英语六级】【仔细阅读】(2)
  5. 羞辱性加薪_如何避免羞辱新人:高级开发人员指南
  6. 前端跨域问题原因及解决方案
  7. 计算 2 的 1000次方
  8. gevent学习介绍
  9. 生物学和游戏:为什么女人不爱游戏- -
  10. Web前端期末大作业-响应式艺术培训机构网页设计(bootstrap+HTML+CSS+JavaScript+)实现