pythoninstaller打包_最详细的Python打包工具:Pyinstaller实战指南,如丝滑般体验!-installer文件夹...-程序员宅基地

技术标签: pythoninstaller打包  

写了个吊炸天的Python项目,把我和左手相处的时间都赔上了。但出于版权考虑,我不太想让使用方直接用我的代码,毕竟Python代码给出去,就真的收不回来了。

想给客户演示的时候,不想那么墨迹的打开dos cmd 或者 terminal ,然后运行 python app.py 这样的命令行。最好是客户双击,完事儿。就像有人在那自己动一样……

PyInstaller 来了,他就是这么一款帮助我们把整个项目完整打包的工具。目前已经兼容Py3.7,以及 Mac App 和 Windows Exe。

文档: https://pyinstaller.readthedo...

先说下,这篇文章有别于网上那坨安装、打包的草包,这次是真核!

1. 安装

Python学习交流群:1004391443,这里是python学习者聚集地,有大牛答疑,有资源共享!小编也准备了一份python学习资料,有想学习python编程的,或是转行,或是大学生,还有工作中想提升自己能力的,正在学习的小伙伴欢迎加入学习。

这个很简单,直接 pip install pyinstaller 就好。

:warning:注意了:你要编译成exe,建议你省心点的在windows上用pyinstaller,如果你要mac app的,那就用mac编译。

我今天就以windows为例

2. 简单使用

这个也很简单,网上一抓一大把,我这里就不赘述了,无非就是那么几个命令:

pyinstaller -F 项目主文件(或者是单一脚本)

3. 参数说明

-F,打包所有的依赖包在一个exe中,包括你自己的模块、内置模块以及第三方模块。

-c,如果你是命令行窗口,就要加上这个参数。

-w,窗口程序,比如你用了PyQt。

4. 高级用法:配置文件

.spec,这个文件非常重要,我们可以通过编辑这个文件来打包我们的项目,类似DockerFile。

我给大家贴一个我的:# -*- mode: python -*-

block_cipher = None

a = Analysis(['C:\\app\\main.py'],

pathex=['C:\\'],

binaries=[],

datas=[

('C:\\data\\input\\builtin\\*.xlsx', '.\\data\\input\\builtin\\'),

('C:\\data\\input\\*.xlsx', '.\\data\\input\\'),

('C:\\data\\output\\', '.\\data\\output\\'),

('C:\\log\\', '.\\log\\'),

('C:\\app\\db\\', '.\\app\\db\\')

],

hiddenimports=['numpy', 'pandas'],

...

)

pyz = PYZ(a.pure, a.zipped_data,

cipher=block_cipher)

exe = EXE(pyz,

...

)

这其实就是一个python文件,只不过后缀是spec罢了。

.spec一共会有4个对象,分别是:Analysis、PYZ、EXE、COLLECT。

Analysis用处最多,一个个解释:第一个参数,是指定我们整个项目的主程序,也就是我们的入口文件。

pathex,就是我们的工作目录

datas,存放我们的数据。

好了,说到这里就要好好说一说这个Pyinstaller的工作流程了。当我们双击编译好的exe后,他是会创建一个临时目录,把所有需要用的包都解压到那里,然后执行。执行完毕后,临时文件夹就消失了。

这和我们有什么关系呢?想一下,如果你的项目中需要去读取某些文件,甚至是用户的输入参数,怎么办?打包出来的exe 是没有办法通过直接指定参数,类似:python main.py --input=*.xlsx 来读取文件的,因为我之前说了,在执行的时候会把项目解压到一个临时目录,所以原来项目中写好的相对路径也不管用。

为此,我们需要把host上的实际文件给copy到那个临时目录下,所以这个datas的作用就是这个,我的文件中,我把host下的 C:\data\input\builtin*.xlsx文件都copy到临时目录的 data\input\builtin 下面。

hiddenimports ,继续说下去,PyInstaller有时候无法侦察到全部的依赖包,怎么办?我们可以在这个后面加,把PyInstaller编译出来的exe在运行的时候报的缺少模块给写里面。

:warning:注意了: pandas 和 numpy 有个很奇怪的地方,就是引用了 pandas 的地方,如果没有引用 numpy ,就会报错。所以你可以在主入口上面加一个 import numpy 。

:warning:注意了:直接 import numpy 还是会报错。怎么办?在 import numpy 下面加 import numpy.core._dtype_ctypes

5. 临时目录

那刚刚说的临时目录在代码里怎么处理呢,如果代码中还是老样子处理相对路径,一定是找不到的。

官方文档中给出了这么一段:Your app should run in a bundle exactly as it does when run from source. However, you may need to learn at run-time whether the app is running from source, or is “frozen” (bundled).

import sys

if getattr( sys, 'frozen', False ) :

# running in a bundle

basedir = sys._MEIPASS

else :

# running live

所以在你的项目中,如果有配置文件的话,就在那里加上这一段,然后在bundle中添加你的新路径,else还是你的老代码。

这个 sys._MEIPASS 是个特殊的值,是在Pyinstaller打包的时候才会添加的临时变量,通过这个变量我们可以获取到在执行exe时候的临时目录。

这对代码的改动是最小的。

6. 编译打包

最后,我们执行 python xxx.spec 就好了。打包的可执行文件会在dist里,build中是一些打包时候需要的文件。

输出中最后有 successfully 字样,就算成功了。他也会告诉你,exe出现在哪个位置。

当然不是说这样就万无一失了,别人也可以反编译你的exe,所以我们可以在打包的时候用Cython去编译一次,把混淆过的代码打包。这样的话难度就增加了,同时再加上mac地址绑定,这里就有多种思路了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39989668/article/details/110535387

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签