时隔一年,上一篇文档比较LOW一点,实现了python2.7的混合编译,可发布无PYTHON环境的机器。发布也是比较LOW,文件特别大。
编译版本:python 3.7.2(用来编译混合编程的)
发布版本:python-3.7.2.post1-embed-win32这个版本用来发布的,因为我们安装的版本实在是太大了。(这个方法也不是最优的,网上还有更优化的,我觉得差不多了能接受了,没有过分优化了)
C++ : VS2015
1、创建C++控制台程序
C++设置属性页
设置输入LIB
这个网上的例子还是蛮多的。
2 写入代码
C++代码
void Hello()
{
Py_Initialize();//调用Py_Initialize()进行初始化
//Py_SetPythonHome(L"F:\\ocrNew\\ocrDll\\testPython\\Debug");
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("testAdd");//调用的Python文件名
cout << pModule;
pFunc = PyObject_GetAttrString(pModule, "Hello");//调用的函数名
PyEval_CallObject(pFunc, NULL);//调用函数,NULL表示参数为空
Py_Finalize();//调用Py_Finalize,和Py_Initialize相对应的.
}
int main()
{
Hello();
//save_Add();
system("pause");
return 0;
}
Python代码
def Hello():
print("sfsfsfs")
def Add(a, b):
return a + b
注意这个python 代码是没有导入任何库文件的。把PYTHON文件和运行程序放到一起。
重点是打包的部分
基础: print HelloWorld,没有任何其他库文件
比较简单粗暴的方法,是把PYTHON的安装目录下的Lib文件夹和DLLs夹以及python**.dll(**代表版本)拷贝到运行目录下,缺点发布的文件太大。
推荐方法:
在官网https://www.python.org/downloads/windows/下载对应版本的embeddable zip file,解压出来改目录名为DLLs,将DLLs目录放在Py_SetPythonHome设置的路径,将解压目录里的python**.dll与python**.zip复制到程序所在目录下。
还有更优化的版本:我是最没用再追求:https://blog.csdn.net/wgxh05/article/details/81740696
那么如果导入库又采用推荐的方法,我们要怎么做?
Python代码
import cv2
def Hello():
print("sfsfsfs")
def Add(a, b):
return a + b
将安装包里对应的库找到后拷贝到python37.zip里面
如果还觉得大怎么办呢?
Pyinstaller打包库,可以用pyinstaller的库。打包完成后可以用里面编译好的cv的.pyd文件,只有原来库的一半大小。
将这个文件拷贝到python37.zip压缩包内。