首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

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

  •  
  •   Huelse · 24 天前 · 1275 次点击

    目前的环境

    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
        1
    ysc3839   24 天前 via Android
    大概是因为没加 extern "C",实际函数名称是 C++ 修饰过的。
    另外更建议你用 pybind11 写成 Python 模块来使用。
        2
    wwqgtxx   24 天前   ♥ 1
    如果你想用 ctypes 或者 cffi 来调用,请用纯 C 函数,否则会遇到无尽的坑(虽然加 extern "C" 能解决一部分问题,但是如果你返回 STL 类型,在 python 层还是无法操作)
        3
    guiqiqi   24 天前 via iPhone   ♥ 1
    哈哈,昨天刚编译完扩展库,顺嘴答一下

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

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

    最后祝题主成功!
        4
    Huelse   24 天前
    @ysc3839 #1 extern "C"用了,显然无用,估计是因为我的返回类型有 vector<string>这种 看样子只能用 pybind11 写了,顺带问下 pybind11 可以这样写吗?感谢~


    @wwqgtxx #2 感谢~了解了。不知楼上说的 pybind11 能否解决?
        5
    Huelse   24 天前
    @guiqiqi #3 ok ok,我去试试,有问题再问你,感谢回复~
        6
    ysc3839   24 天前 via Android   ♥ 2
        7
    Huelse   24 天前
    @ysc3839 #6 ok,我还用到了扩展库 seal,让我试下,谢谢您~
        8
    ysc3839   24 天前 via Android
    @ysc3839 同时不太推荐 boost.python,因为:
    boost 需要手动编译,而 pybind11 是 headers only 的,直接 include 就能用。
    pybind11 有配套的 cmake 脚本,可以方便地实现跨平台编译。
        9
    wikinee   24 天前
    这种还真不知道。
    我这两天用了 cython 把 python 源码转成 so,手动步骤就是 py->c->so
    另外,Linux 一般做法是 写一个 gir 之类的绑定,不知道 Windows 是怎么做的
        10
    lilydjwg   24 天前
    你可以学习一下 Python C API,用 C 实现个函数返回一个包含一堆 PyUnicodeObject 的 PyListObject。
        11
    wwqgtxx   24 天前
    @Huelse pybind11 我没有用过,不是很了解,我自己的做法是自己用 C 写个兼容层,然后在 python 那边用代码包装一下,当然这样的性能并不高,看 pybind11 的文档应该更适合解决你的问题
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   916 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 33ms · UTC 19:45 · PVG 03:45 · LAX 12:45 · JFK 15:45
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1