请问怎么生成 dll 或者 so 以便在 Python 中调用

2019-05-26 22:31:38 +08:00
 Huelse

目前的环境

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 要用到

请求各位能帮个忙~

感激不尽

3250 次点击
所在节点    Python
11 条回复
ysc3839
2019-05-26 22:36:10 +08:00
大概是因为没加 extern "C",实际函数名称是 C++ 修饰过的。
另外更建议你用 pybind11 写成 Python 模块来使用。
wwqgtxx
2019-05-26 22:38:30 +08:00
如果你想用 ctypes 或者 cffi 来调用,请用纯 C 函数,否则会遇到无尽的坑(虽然加 extern "C" 能解决一部分问题,但是如果你返回 STL 类型,在 python 层还是无法操作)
guiqiqi
2019-05-26 22:44:56 +08:00
哈哈,昨天刚编译完扩展库,顺嘴答一下

题主可以考虑使用 boost::python 将 C++代码导出到 python,windows 的话用 VS 直接编译成 pyd 调用就好; Linux 的话用 python 自带的 distutils 调用 gcc 编译成 so 使用

记得注意代码的跨平台兼容性哦,如果决定使用 boost::python 导出,可以尽量把 std 里一些东西换成 boost 里的,对减少编译错误有帮助。

最后祝题主成功!
Huelse
2019-05-26 22:46:33 +08:00
@ysc3839 #1 extern "C"用了,显然无用,估计是因为我的返回类型有 vector<string>这种 看样子只能用 pybind11 写了,顺带问下 pybind11 可以这样写吗?感谢~


@wwqgtxx #2 感谢~了解了。不知楼上说的 pybind11 能否解决?
Huelse
2019-05-26 22:49:59 +08:00
@guiqiqi #3 ok ok,我去试试,有问题再问你,感谢回复~
ysc3839
2019-05-26 23:05:03 +08:00
Huelse
2019-05-26 23:08:27 +08:00
@ysc3839 #6 ok,我还用到了扩展库 seal,让我试下,谢谢您~
ysc3839
2019-05-26 23:15:26 +08:00
@ysc3839 同时不太推荐 boost.python,因为:
boost 需要手动编译,而 pybind11 是 headers only 的,直接 include 就能用。
pybind11 有配套的 cmake 脚本,可以方便地实现跨平台编译。
wikinee
2019-05-27 00:07:54 +08:00
这种还真不知道。
我这两天用了 cython 把 python 源码转成 so,手动步骤就是 py->c->so
另外,Linux 一般做法是 写一个 gir 之类的绑定,不知道 Windows 是怎么做的
lilydjwg
2019-05-27 00:27:07 +08:00
你可以学习一下 Python C API,用 C 实现个函数返回一个包含一堆 PyUnicodeObject 的 PyListObject。
wwqgtxx
2019-05-27 00:43:51 +08:00
@Huelse pybind11 我没有用过,不是很了解,我自己的做法是自己用 C 写个兼容层,然后在 python 那边用代码包装一下,当然这样的性能并不高,看 pybind11 的文档应该更适合解决你的问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/567858

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX