Python 嵌入 C++该怎么和 C++代码互相调用 - V2EX
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 4526 次点击
    这是一个创建于 3605 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近有个项目需要在 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     Solana     972 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 22:57 PVG 06:57 LAX 15:57 JFK 18:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86