梳理一下程序编写和打包的流程避免碰到问题再重新搜索,本身不是专业的,写一些小程序方便工作使用,各个环节如果有更好的方案请各位大佬多指导。
目录
二、下载对应版本的嵌入式python包(也可以程序调试完成了最后下载)
一、配置虚拟环境
打开anaconda的命令行界面,创建需要python版本的环境
conda create -n name python=3.8
activate name
name就是需要配置的虚拟环境的名称,第一步创建,第二部切换到这个环境,切换到对应环境后可以通过pip安装各种需要的包
二、下载对应版本的嵌入式python包(也可以程序调试完成了最后下载)
官网下载,按图示选择需要的平台和版本的python嵌入式安装包
三、创建项目目录
(1)runtime:解压后的python嵌入式包,写代码调试的时候可以不用管这个,最后打包的时候再来处理
(2)start.py: 程序的入口,切换工作路径到这个目录下,根据自己的项目需要放置其他文件夹,
比如我自己的这个是界面用的Qtdesinger生成的文件就单独放一个文件夹ui,一些逻辑函数放在scr里面。程序编写的时候用的Pycharm,将anaconda创建的虚拟环境的python 配置给start.py,每次启动这个程序即可。
import sys
import os
if __name__ == '__main__':
work_dir=os.path.dirname(os.path.abspath(__file__))
os.chdir(work_dir)
sys.path.append(os.path.abspath('scr'))
sys.path.append(os.path.abspath('qt'))
sys.path.append(os.path.abspath('ui'))
sys.path.append(os.path.abspath('scr.egg'))
import main
main.main()
四、Python嵌入式包配置
目录下创建一个start.bat,通过调用嵌入式包中的python.exe运行入口的.py程序
@echo off
runtime\python.exe start.py
runtime下找到这个文件,在里面添加包的相对路径,创建对应的文件夹后,从虚拟环境中将需要的包拷贝至这个目录下,然后根据自己项目需要将包里面的模块进行剪切,如果剪切之后程序无法运行就再拷回去
五、.py文件转换为.pyd
遍历目录下的.py程序打包为.pyd
在.py文件的目录的上一级目录创建setup.py文件
from setuptools import setup
from Cython.Build import cythonize
import glob
import os
# 获取当前目录下所有的 .py 文件
py_files = glob.glob(os.path.join('.py文件路径', '*.py'))
setup(ext_modules = cythonize(py_files, compiler_directives={'language_level': "3"}))
在python的对应环境下运行命令,anaconda的命令行界面中激活对应的环境,切换到setup.py的路径下,运行下方的命令,生成的.pyd文件可拷贝至第四点中配置的包的目录下即可正常运行:
python setup.py build_ext --inplace
执行这一步的时候出现了一个问题,只要是类里面的函数转换为.pyd后则无法使用,如
def xxx(self)的都会提示传递给函数的参数多了一个,暂时未找到如何处理,因此只将一些关键的代码单独拎出来转换为.pyd
六、Inno Setup
写好的程序里面有一些文件需要一直更新,因此选择打包为可安装的程序,如果没有配置文件修改等需求,可以用Enigma Virtual Box打包。
Inno Setup生成的脚本中加入下列两行可给与程序工作路径的管理员权限,如安装后文件夹下的文件出现无法编辑的情况可尝试该方法。
[Dirs]
Name: {app}; Permissions: users-full