Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子

Posted Data+Science+Insight

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子相关的知识,希望对你有一定的参考价值。

Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子

目录

Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子

安装

模型构建代码

打包及踩坑记录


安装

# 安装Pyinstaller

# 类似pyinstall的打包工具还有:Freeze py2exe Pyintealler,笔者这里使用pyinstaller

pip install PyInstaller

或者

pip install pyinstaller

#把程序进行打包

# you_model.py为你需要打包的python程序代码

pyinstaller -F you_model.py

#PyInstaller bundles a Python application and all its dependencies into a single package.

模型构建代码

# 加载需要的包和库

import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
import pickle
import os
# from sklearn.externals import joblib

# 加载数据

# 设置as_frame模型,这样加载的数据为pandas dataframe格式,否则模型为numpy数组格式;

# Load the iris data
iris = datasets.load_iris(as_frame = True)
# Create a matrix, X, of features and a vector, y.
X, y = iris.data, iris.target

type(X),type(y)
(pandas.core.frame.DataFrame, pandas.core.series.Series)

#

df = pd.concat([X,y],axis = 1)

df.head()

df.iloc[:,:-1].head()

 # 将数据写入文件dataset.csv中供后续测试使用;

df.to_csv('dataset.csv',index=0,sep=',',encoding='utf-8')

# 逻辑回归分类器构建、模型保存加载模块

# Train a naive logistic regression model
clf = LogisticRegression(random_state=0)
clf.fit(X, y)



import pickle
# save the model we just trained
s=pickle.dumps(clf)
f=open("model_A.pkl",'wb')
f.write(s)
f.close()


f=open("model_A.pkl",'rb')
model=pickle.loads(f.read())
model.predict(X)

# 预测程序(对测试数据进行预处理、特征工程、补齐等操作,加载模型进行推理),后续将该程序打包

# prediction.py

#prediction

import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
import pickle
import os

def inference_process(base_dir):
    """
    inference data processing and engineering
    
    """
    file_name = os.listdir(base_dir)[0]
    # encoding
    data = pd.read_csv(base_dir + "\\\\" + file_name)

    # 推理数据预处理流程;
    # 数据清洗、特征工程;
    # 数据补齐、数据变换;
    
    
    return data


if __name__ == "__main__":


    #  原始数据处理
    data_dir = r"dataset"  
    # 原始表数据的路径
    data = inference_process(data_dir)  
    # 调用处理函数
    
    # 模型调用
    f=open("model_A.pkl",'rb')
    model=pickle.loads(f.read())
    
    #结果预测,并输出到CSV
    y_pred = model.predict(data.iloc[:,:-1])  
    print(y_pred)
    # 结果预测
    data['prediction'] = y_pred
    data.to_csv('with_prediction.csv', index=0,sep = ',')
    
    print("done!")
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1
 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
done!

打包及踩坑记录

# 在windows下anaconda中打开terminal

# 注意:cd d: 不管用,需要使用 d:

# 进入之后再使用cd命令;

# 运行 pyinstaller -F prediction.py 

# 发生编码错误,去除prediction中的汉语字符

#到了这里不要心急,得等一会,根据你下载包的个数以及大小的不同,可能时间会有一定的差异;

# 所以只要不报错,等一会就好了;

#出现如下错误

win32ctypes.pywin32.pywintypes.error: (2, 'LoadLibraryEx', '系统找不到指定的文件。')

#怀疑是原来构建中的临时文件干扰了新的构建,删除之后继续构建,依旧同样错误;

#上stackoverflow和csdn查看,七嘴八舌说啥的都有,最后采纳了降低版本的方法成功

pip install pyinstaller==3.5

# pyinstaller -F prediction.py

# 打包后的文件结构如下:

#打包生成的prediction.exe文件就存放在dist目录中

#双击prediction.exe文件

#发生如下错误:

ModuleNotFoundError: No module named 'scipy.spatial.transform._rotation_groups'

#在主函数中加入:

#import scipy.spatial.transform._rotation_groups

# 接着出现如下问题:

# ModuleNotFoundError: No module named 'scipy.special.cython_special'

#感觉这一切都像是一个无底洞啊,,,,

# sklearn.utils._cython_blas

# ModuleNotFoundError: No module named 'sklearn.utils._cython_blas'

#接着就到了sklearn.utils._weight_vector错误

# ModuleNotFoundError: No module named 'sklearn.utils._weight_vector'

#最终打包代码如下:

# 加入input函数为了防止弹窗自己快速退出;

input("input:")

#prediction

import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
import pickle
import os

def inference_process(base_dir):

    """
    inference data processing and engineering
    
    """
    
    file_name = os.listdir(base_dir)[0]
    #encoding
    data = pd.read_csv(base_dir + "\\\\" + file_name)
    
    return data


if __name__ == "__main__":

    import scipy.spatial.transform._rotation_groups
    import scipy.special.cython_special
    import sklearn.utils._cython_blas
    import sklearn.utils._weight_vector
    data_dir = r"dataset"
    
    data = inference_process(data_dir)
    
    f=open("model_A.pkl",'rb')
    model=pickle.loads(f.read())
    
    y_pred = model.predict(data.iloc[:,:-1])
    print(y_pred)
    
    data['prediction'] = y_pred
    data.to_csv('with_prediction.csv', index=0,sep = ',')
    
    print("done!")
    #to keep the process
    input("input:")

接着尝试使用如下方式进行打包和构建:

pyinstaller --hidden-import scipy.spatial.transform._rotation_groups --hidden-import scipy.special.cython_special --hidden-import sklearn.utils._cython_blas --hidden-import sklearn.utils._weight_vector --onefile prediction.py

也OK了,

BINGO

参考:http://www.pyinstaller.org/

参考:使用pyinstaller把py文件打包为exe文件

参考:windows 命令行怎么切换盘符

参考:Windows下切换盘符

参考:python3项目打包成exe可执行程序

参考:pythoninstaller

参考:用pyinstaller打包失败报错win32ctypes.pywin32.pywintypes.error: (1920, ‘LoadLibraryExW’, ‘系统无法访问此文件。’)

参考:python pyinstaller打包工具遇到的坑

参考:PyInstaller win32ctypes.pywin32.pywintypes.error: (2, 'LoadLibraryExW', 'The system cannot find the file specified.')

参考:Pyinstaller win32ctypes.pywin32.pywintypes.error: (1920, 'LoadLibraryExW', 'System cannot access the file')

参考:No module named 'scipy.spatial.transform._rotation_groups after compile python script with pyinstaller

参考:No module named 'scipy.spatial.transform._rotation_groups after compile python script with pyinstaller

以上是关于Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子的主要内容,如果未能解决你的问题,请参考以下文章

Python第三方库:Pyinstaller——神奇的Py打包工具

PyInstaller 如何打包多个py文件?

Python利用pyinstaller工具将py文件打包成.exe可执行文件

用来用去,Python脚本打包 exe还是这款工具最棒

[工具] 利用setuptools打包python程序

如何将Python打包后的exe还原成.py?