文章目录

  • 操作详情:
  • 1.安装Cython
  • 2.修改调用外部数据or文件的.py文件
  • 4.在命令行运行python setup.py build_ext --inplace
  • 5.创建main.py文件,, import 所有用到的包,写一个main()接口调用主程序。
  • 6. 命令行运行pyi-makespec -F main.py 生成main.spec
  • 7. 用记事本打开main.spec,编辑data处
  • 8. 打开命令行,运行chcp 65001 和pyinstaller -F main.spec
  • 9.在打包的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环境的命令行)

python xpinyin pypinyin 区别 pyinstaller pyd_数据

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处

python xpinyin pypinyin 区别 pyinstaller pyd_命令行_02

[ ]内的格式为('要打包的数据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