Python项目打包成二进制的方法


Posted in Python onDecember 30, 2020

Python项目打包

python本身是一种脚本语音,发布的话,直接发布源代码就可以了,但是,可能有些公司并不想发布源代码,那么,就涉及到打包了,网上有很的打包教程,其实我也没有认真去研究,因为我只想简单点,所以,我打算直接编译成pyc二进制文件来发布,就可以了。

问题

编译成二进制文件(*.pyc)之后,文件名都变了,模块之间怎么引用?
网上的例子,大都是对单个文件编译的介绍,对整个目录编译的话,也都是输出到相应的文件夹下,需要单独抽取出来,发布。

解决问题

一般编译之后的文件命名为:比如我的源文件为test.py,编译后输出到__pycache__文件夹下test.cpython-37.pyc,要保持模块引用不改变,那么必须在编译之后重命名为test.pyc文件,批注:37是因为我使用的python版本为3.7.4所以含有37,其他版本要做相应的调整。
需要按照原来的项目目录结构输出pyc文件才能保证模块之间调用没有问题。

编码实现

import os
import shutil
import compileall
from pathlib import Path
versions = ".cpython-37"
pycache = "__pycache__"
build_dir = "build"
root = os.getcwd()
print("正在编译文件...请等待...")
compileall.compile_dir(root) # 编译
build = Path(root,build_dir)
if build.exists():
    print("正在移除build目录...请等待...")
    shutil.rmtree(build)
print("正在复制文件...请等待...")
shutil.copytree(root,build) # 复制文件到build目录
for root, dirs, files in os.walk(build): # 开始遍历文件
        # root 表示当前正在访问的文件夹路径
        # dirs 表示该文件夹下的子目录名list
        # files 表示该文件夹下的文件list
        # 遍历文件
        for f in files:
            src = os.path.join(root, f)
            if f.endswith(".py"):
                os.remove(src)
            elif f.endswith(".pyc"):
                upper_dir = root.replace(pycache,"")
                dst = os.path.join(upper_dir,f.replace(versions,""))
                shutil.copy(src,dst)
for root, dirs, files in os.walk(build): # 移除缓存文件夹
    print("正在移除缓存文件...请等待...")
    if root.endswith(pycache):
        shutil.rmtree(root)
print("打包完成...请查看目录:"+str(build))

注意文件中版本号的调整,基本上是通用的,所有的python项目都可以用拿来就用。代码很简单,但是很实用。

牛人之所以是牛人,是因为你现在在踩的坑,他曾经都已经踩过了。

以上就是Python项目打包成二进制的方法的详细内容,更多关于Python项目打包成二进制的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
使用Python实现博客上进行自动翻页
Aug 23 Python
python递归打印某个目录的内容(实例讲解)
Aug 30 Python
基于Django的python验证码(实例讲解)
Oct 23 Python
python八大排序算法速度实例对比
Dec 06 Python
Python中请不要再用re.compile了
Jun 30 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
Jul 04 Python
pytorch 修改预训练model实例
Jan 18 Python
Python 如何操作 SQLite 数据库
Aug 17 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
Oct 10 Python
python3爬虫中多线程进行解锁操作实例
Nov 25 Python
pycharm中leetcode插件使用图文详解
Dec 07 Python
用python对excel进行操作(读,写,修改)
Dec 25 Python
Python 实现RSA加解密文本文件
Dec 30 #Python
python之随机数函数的实现示例
Dec 30 #Python
利用Python实现学生信息管理系统的完整实例
Dec 30 #Python
使用gunicorn部署django项目的问题
Dec 30 #Python
pyspark对Mysql数据库进行读写的实现
Dec 30 #Python
python实现无边框进度条的实例代码
Dec 30 #Python
python中的列表和元组区别分析
Dec 30 #Python
You might like
基于文本的留言簿
2006/10/09 PHP
PHP获取网卡地址的代码
2008/04/09 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
PHP中非常有用却鲜有人知的函数集锦
2019/08/17 PHP
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
jquery ajax 调用失败的原因示例介绍
2013/09/27 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
js Calender控件使用详解
2015/01/05 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
html+js实现简单的计算器代码(加减乘除)
2016/07/12 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
vuex进阶知识点巩固
2018/05/20 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
对python生成业务报表的实例详解
2019/02/03 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
Python全栈之列表数据类型详解
2019/10/01 Python
python selenium操作cookie的实现
2020/03/18 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
如何理解Python中包的引入
2020/05/29 Python
python简单利用字典破解zip文件口令
2020/09/07 Python
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
高中毕业自我鉴定
2013/12/19 职场文书
安全生产活动月方案
2014/03/09 职场文书
安全月宣传标语
2014/10/07 职场文书
办公用房租赁协议书
2014/11/29 职场文书
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android