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
chinuno
V2EX  ›  Python

Python 嵌入 C++该怎么和 C++代码互相调用

  •  
  •   chinuno · 2015-12-03 09:56:07 +08:00 · 4117 次点击
    这是一个创建于 3284 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近有个项目需要在 C++中嵌入 Python 。网上看了一下最合适的似乎是使用 boost.python 。
    如果单纯的执行 Python 代码并没什么问题,但是有一种情况
    例如 c++的 foo()函数中使用了嵌入的 Python 代码,另一个 c++的 bar()函数中的 Python 代码要调用 foo()该怎么做?
    15 条回复    2015-12-13 10:53:59 +08:00
    nashge
        1
    nashge  
       2015-12-03 10:19:42 +08:00
    nooper
        2
    nooper  
       2015-12-03 10:26:49 +08:00 via iPad
    如果项目不大你可以考虑原生的代码,或者用 cython 。 swig 也可以。注意锁
    chinuno
        3
    chinuno  
    OP
       2015-12-03 10:41:33 +08:00
    @nashge 这篇回答昨天有看到过。他在 python 使用 c++代码需要先编译成 dll ,但是我想要的是在整个程序中两种代码可以互相调用,看来是没有合适的方案了?

    @nooper 项目不算小了,而且时间有点短,所以才需要嵌入 python 来提高开发效率。关于 cython 和 swig 的问题看一下上面的回复。应该也是只能编译成 dll 后才能调用 C++代码的
    nooper
        4
    nooper  
       2015-12-03 10:48:57 +08:00
    互相调用只能用 boot,python 。或者纯 python C 的接口。
    chinuno
        5
    chinuno  
    OP
       2015-12-03 11:05:25 +08:00
    @nooper 把 boost 官方的文档看了一边。还是需要编译成 dll 。虽然要编译麻烦点是无所谓。但是能实现我的要求嘛?
    foo(){
    ...
    bar();
    ...
    }
    bar(){
    ...
    exec(foo()); //在 python 中执行 foo()
    ...
    }
    大概像这样
    nooper
        6
    nooper  
       2015-12-03 11:23:26 +08:00 via iPad   ❤️ 1
    我写过原生的代码, boost 还真没研究内部调用的
    MCVector
        7
    MCVector  
       2015-12-03 12:01:34 +08:00   ❤️ 1
    啊哈我之前正好写了一个,把 C++ 的接口暴露出来给 python 调用。 python 跑在一个独立线程上,可以是 python shell 也可以是脚本(比如说 python 写的 GUI )之类。基本上是在这个类里实现的,如果不嫌弃的话可以看看。

    https://github.com/v3c70r/GL4Framework/blob/master/pyConsole.h

    https://github.com/v3c70r/GL4Framework/blob/master/pyConsole.cpp
    MCVector
        8
    MCVector  
       2015-12-03 12:13:53 +08:00
    瞎了没看下面的需求,没有试过行不行。。。
    messycode
        9
    messycode  
       2015-12-03 12:46:55 +08:00
    用 c 包裹一层, 然后用 cffi
    chinuno
        10
    chinuno  
    OP
       2015-12-03 14:01:55 +08:00
    @MCVector 之前一直没看官方的 C API ,就想着用 boost.python 。看了你的代码后自己实现的一下成功了。非常感谢!
    MCVector
        11
    MCVector  
       2015-12-03 14:40:31 +08:00
    棒!
    defage
        12
    defage  
       2015-12-03 20:20:50 +08:00
    swig 以前是这么用的, c++的方法会封装出来给 py 调用。不过貌似这种方法好过时了
    oscarzhao
        13
    oscarzhao  
       2015-12-04 13:12:00 +08:00 via Android
    https://github.com/Oscarzhao/vsprogram/tree/master/BoostPython , boost Python 是最强大的一个,除了单例模式下的回调,其它情况应该都没问题
    congeec
        14
    congeec  
       2015-12-13 08:47:44 +08:00
    这个应该是你想要的
    https://github.com/wjakob/pybind11
    chinuno
        15
    chinuno  
    OP
       2015-12-13 10:53:59 +08:00
    @congeec 谢谢你的推荐。我是要在 vs2013 上开发的,看了下文档他说 vs2015 之前的不能用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1012 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:52 · PVG 03:52 · LAX 11:52 · JFK 14:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.