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

it2023-09-01  86

文章目录

操作详情:1.安装Cython2.修改调用外部数据or文件的.py文件4.在命令行运行python setup.py build_ext --inplace5.创建main.py文件,, import 所有用到的包,写一个main()接口调用主程序。6. 命令行运行pyi-makespec -F main.py 生成main.spec7. 用记事本打开main.spec,编辑data处8. 打开命令行,运行chcp 65001 和pyinstaller -F main.spec9.在打包的main.py同目录下的dist文件夹中找到main.exe 本文的操作是先将.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

最新回复(0)