目前的环境
vs2017 python3.6.8
因为要用 seal 库,所以选择生成 dll 来方便 python 调用
样例 util.cpp
#include <iostream>
...
#include "seal/seal.h"
shared_ptr<SEALContext> createContext() { ... }
vector<string> { ... }
string hamming() { ... }
生成了 dll 和 lib 文件 但到 python 上调用就是 AttributeError: function not found
网上找了很多 csdn 的文章,没啥帮助,我还想移植到 linux 上
seal 库会有个 seal.lib 要用到
请求各位能帮个忙~
感激不尽
1
ysc3839 2019-05-26 22:36:10 +08:00 via Android
大概是因为没加 extern "C",实际函数名称是 C++ 修饰过的。
另外更建议你用 pybind11 写成 Python 模块来使用。 |
2
wwqgtxx 2019-05-26 22:38:30 +08:00 1
如果你想用 ctypes 或者 cffi 来调用,请用纯 C 函数,否则会遇到无尽的坑(虽然加 extern "C" 能解决一部分问题,但是如果你返回 STL 类型,在 python 层还是无法操作)
|
3
guiqiqi 2019-05-26 22:44:56 +08:00 via iPhone 1
哈哈,昨天刚编译完扩展库,顺嘴答一下
题主可以考虑使用 boost::python 将 C++代码导出到 python,windows 的话用 VS 直接编译成 pyd 调用就好; Linux 的话用 python 自带的 distutils 调用 gcc 编译成 so 使用 记得注意代码的跨平台兼容性哦,如果决定使用 boost::python 导出,可以尽量把 std 里一些东西换成 boost 里的,对减少编译错误有帮助。 最后祝题主成功! |
4
Huelse OP |
6
ysc3839 2019-05-26 23:05:03 +08:00 via Android 2
@Huelse 有传递 STL 类型的话显然是不能直接 extern "C" 的。
pybind11 应该是支持自动转换的 https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html https://github.com/pybind/pybind11/blob/master/tests/test_stl.py https://github.com/pybind/pybind11/blob/master/tests/test_stl.cpp |
8
ysc3839 2019-05-26 23:15:26 +08:00 via Android
@ysc3839 同时不太推荐 boost.python,因为:
boost 需要手动编译,而 pybind11 是 headers only 的,直接 include 就能用。 pybind11 有配套的 cmake 脚本,可以方便地实现跨平台编译。 |
9
wikinee 2019-05-27 00:07:54 +08:00
这种还真不知道。
我这两天用了 cython 把 python 源码转成 so,手动步骤就是 py->c->so 另外,Linux 一般做法是 写一个 gir 之类的绑定,不知道 Windows 是怎么做的 |
10
lilydjwg 2019-05-27 00:27:07 +08:00
你可以学习一下 Python C API,用 C 实现个函数返回一个包含一堆 PyUnicodeObject 的 PyListObject。
|
11
wwqgtxx 2019-05-27 00:43:51 +08:00
@Huelse pybind11 我没有用过,不是很了解,我自己的做法是自己用 C 写个兼容层,然后在 python 那边用代码包装一下,当然这样的性能并不高,看 pybind11 的文档应该更适合解决你的问题
|