python 创建 动态链接库 到 c++ 调用

1. 如果想要在 c++ 中 debug 模式调试模式运行,windows下的话,需要安装时安装 debug 库

2. 安装 cython

3. 编写 pyx 文件,例如 demo.pyx:

# distutils: language = c++
cdef public int add(int a,int b):
return a + b

4. 编译为 c 代码

 cython demo.pyx

 或者编写 setup.py,然后执行 python setup.py,这种方式可自定义的东西比较多

import os
from distutils.core import setup
from Cython.Build import cythonize

setup(name='demo'
      ,ext_modules=cythonize("main.pyx",compiler_directives={'language_level': '3'},annotate=True)
      ,script_args=["build_ext", "-b", "./build", "-t", "./build/temp"])

os.remove("./main.h")
os.remove("./main.cpp")
os.remove("./main.html")

5. 在 vsiual studio 中编译 c++

    a) vc++引入python安装目录下的 includes 和 libs 目录,再引用库文件 python310.lib 或 python310_d.lib

    b) 把第4步生成的 demo.h 和 demo.cpp 复制到 c++ 项目,调试直到编译通过

6. 都有 c++ 代码了,导出 dll 已不是问题。但生成的 dll 需要 python 基础环境支持,并且如果调用了其它 python 文件,也需要一同复制到发布目录下

经过几天的摸索,这种方式无法引用 python 当前环境中的包,一旦牵扯到引入其它的模块(比如 easygui ,已在python环境中安装),以下这句代码就会引发异常:

__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_easygui); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 5, __pyx_L1_error)

似乎这样的方法必须是纯C++代码,无法调用python的任何模块,权且当作是一个C++共享模块吧。且这种方式并没有与直接调用pyd文件的python运行在一个上下文中,改变的变量无法在另一种访问方式中留下痕迹。

看来C++调用包含 python模块的代码只能通过c++直接加载 pyd,而不能直接引用 cython 生成的 .h 和 .cpp 文件了。

7. 虽然直接调用c++方法有难度,但可以直接调用 python 方法,python 方法再去调用 cdef 定义的方法,用cython 优化后续的方法就可以了,但不知这样损失的效率到底有多少,起码传参和返回都是 PyObject

posted on 2022-11-03 15:37  空明流光  阅读(1043)  评论(0编辑  收藏  举报

导航