python源码只有编译成二进制_Python项目打包成二进制

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项目都可以用拿来就用。代码很简单,但是很实用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值