V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Huelse
V2EX  ›  Python

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

  •  
  •   Huelse · 2019-05-26 22:31:38 +08:00 · 3250 次点击
    这是一个创建于 2039 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前的环境

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

    请求各位能帮个忙~

    感激不尽

    11 条回复    2019-05-27 00:43:51 +08:00
    ysc3839
        1
    ysc3839  
       2019-05-26 22:36:10 +08:00 via Android
    大概是因为没加 extern "C",实际函数名称是 C++ 修饰过的。
    另外更建议你用 pybind11 写成 Python 模块来使用。
    wwqgtxx
        2
    wwqgtxx  
       2019-05-26 22:38:30 +08:00   ❤️ 1
    如果你想用 ctypes 或者 cffi 来调用,请用纯 C 函数,否则会遇到无尽的坑(虽然加 extern "C" 能解决一部分问题,但是如果你返回 STL 类型,在 python 层还是无法操作)
    guiqiqi
        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 里的,对减少编译错误有帮助。

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


    @wwqgtxx #2 感谢~了解了。不知楼上说的 pybind11 能否解决?
    Huelse
        5
    Huelse  
    OP
       2019-05-26 22:49:59 +08:00
    @guiqiqi #3 ok ok,我去试试,有问题再问你,感谢回复~
    ysc3839
        6
    ysc3839  
       2019-05-26 23:05:03 +08:00 via Android   ❤️ 2
    Huelse
        7
    Huelse  
    OP
       2019-05-26 23:08:27 +08:00
    @ysc3839 #6 ok,我还用到了扩展库 seal,让我试下,谢谢您~
    ysc3839
        8
    ysc3839  
       2019-05-26 23:15:26 +08:00 via Android
    @ysc3839 同时不太推荐 boost.python,因为:
    boost 需要手动编译,而 pybind11 是 headers only 的,直接 include 就能用。
    pybind11 有配套的 cmake 脚本,可以方便地实现跨平台编译。
    wikinee
        9
    wikinee  
       2019-05-27 00:07:54 +08:00
    这种还真不知道。
    我这两天用了 cython 把 python 源码转成 so,手动步骤就是 py->c->so
    另外,Linux 一般做法是 写一个 gir 之类的绑定,不知道 Windows 是怎么做的
    lilydjwg
        10
    lilydjwg  
       2019-05-27 00:27:07 +08:00
    你可以学习一下 Python C API,用 C 实现个函数返回一个包含一堆 PyUnicodeObject 的 PyListObject。
    wwqgtxx
        11
    wwqgtxx  
       2019-05-27 00:43:51 +08:00
    @Huelse pybind11 我没有用过,不是很了解,我自己的做法是自己用 C 写个兼容层,然后在 python 那边用代码包装一下,当然这样的性能并不高,看 pybind11 的文档应该更适合解决你的问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5086 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:15 · PVG 09:15 · LAX 17:15 · JFK 20:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.