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.')
以上是关于Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子的主要内容,如果未能解决你的问题,请参考以下文章
Python第三方库:Pyinstaller——神奇的Py打包工具