pyinstaller 打包.py文件生成exe(含转换.py文件为.pyd,保护源码,适合发布程序or论文复现用)


本文的操作是先将.py文件通过Cython编译为.pyd,然后再通过pyinstaller 打包为一个可执行文件

操作详情:

1.安装Cython

打开cmd,输入

pip install Cython -i https://pypi.tuna.tsinghua.edu.cn/simple

(如果用anaconda安装的python环境,打开anaconda环境的命令行)
在这里插入图片描述

2.修改调用外部数据or文件的.py文件

在调用外部数据的地方之前,先加入如下语句,filename做相应修改

import os,sys
if getattr(sys, 'frozen', False):    # 查找 sys 中有没 frozen 属性,如果没有返回Fasle。
#sys中的 'frozen' 属性 是打包成 一个EXE文件特有的属性。
        bundle_dir = sys._MEIPASS   
else:
        # 这是在没打包成一个EXE文件的情况下,文件的当前路径。
        bundle_dir = os.path.dirname(os.path.abspath(__file__))

filename ='pic.png'  # pic.png为图片名。
filename = os.path.join(bundle_dir, filename) 

因为数据打包进入exe后,数据被压缩,运行时会被解压到临时路径,这些数据可以视为程序运行的依赖文件,sys._MEIPASS 就是这些依赖文件的路径,仅在 exe 运行时有效,在IDE测试运行时会报错

3.创建setup.py,输入以下

import Cython.Build
import distutils.core

a1 = Cython.Build.cythonize("main_MOEA_D.py")[0]

b1 = Cython.Build.cythonize("./util/common.py")[0]
b2 = Cython.Build.cythonize("./util/dmoead.py")[0]
b3 = Cython.Build.cythonize("./util/individual.py")[0]
b4 = Cython.Build.cythonize("./util/objective.py")[0]
b5 = Cython.Build.cythonize("./util/plot_image.py")[0]
b6 = Cython.Build.cythonize("./util/plot_image123.py")[0]
b7 = Cython.Build.cythonize("./util/recombination.py")[0]
b8 = Cython.Build.cythonize("./util/scalar_func.py")[0]
#返回distutils.extension.Extension对象列表
distutils.core.setup(
name = 'pyd的编译',#包名称,可以不用管
version = "1.0",#包版本号
ext_modules=[a1,b1,b2,b3,b4,b5,b6,b7,b8],#扩展模块
author = "",#作者
)

(备注:ext_modules = [ ]里的是需要转换.py为.pyd格式的文件,创建的setup.py 文件要和他们在同一个文件夹下,单个文件可以不写[ ])

4.在命令行运行python setup.py build_ext --inplace

(需要电脑有vs,–inplace 表示在当前文件下生成.c和.pyd文件)

5.创建main.py文件,, import 所有用到的包,写一个main()接口调用主程序。

6. 命令行运行pyi-makespec -F main.py 生成main.spec

7. 用记事本打开main.spec,编辑data处

在这里插入图片描述

[ ]内的格式为('要打包的数据or文件的绝对路径', '.')
后面的点.表示,运行exe时,外部数据直接解压到同目录下.
可以不写.,但是需要调用外部数据的.py要相应修改
(方法照写,但是不想折腾就忽略这段话)
方法为:filename上加上文件,例如,如果你在datas里写的是(‘D:/image1.png’ , ’img’),那么调用该数据的.py文件中的filename就改成’img/image1.png’

8. 打开命令行,运行chcp 65001 和pyinstaller -F main.spec

运行chcp 65001,是为了防止出现unable encode ‘utf-8’的问题。

9.在打包的main.py同目录下的dist文件夹中找到main.exe

参考文章:
1.https://blog.csdn.net/weixin_42146296/article/details/92848315
2.https://blog.csdn.net/MAOZEXIJR/article/details/91971027

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值