2016-07-27 16 views
0

我有一个用C++编写的程序,它自己运行,但是我们想让它可以被Python访问。具体来说,我们有几个在C++中更高效的函数,但是我们使用Python脚本对输出做了很多其他的事情。我不想在Python中重写整个main(),因为我们利用Boost的根发现算法和其他功能,这在Python中会很痛苦。在C++程序中的函数的Python绑定

是否有可能在保持C++ main()的同时向这些函数添加Python绑定?我从来没有做过Python绑定,但我已经看过Boost.python,因为我们已经在使用Boost了。大多数示例在hpp文件中使用C++函数/类,并将它们嵌入到python程序中,这不完全是我们想要的。

我们希望将我们的C++程序作为一个独立的程序来运行,以便它可以像用户想要的那样运行,并且还允许用户从Python程序中调用这些函数。能够使用相同的Makefile和exe会很好。我们并不是真的想要创建一个包含绑定函数的独立C++库;我们对创建代码的pythonic版本不感兴趣,只是允许访问这些有用的函数。

感谢

+1

可能的重复[调用C/C++从python?](http://stackoverflow.com/questions/145270/calling-c-c-from-python) –

+0

您可能需要GObject Introspection库。 – Arunmu

+0

至少在Cython中,可能有像C++ main - > C函数在cython中实现 - > python代码 - >在cython中实现的python模块 - > C++代码...'的调用链。 Boost.python也可能是可能的。 –

回答

1

我们。我们通过使用它要求我们在推动蟒蛇定义的接口蟒蛇包装类的提供给蟒蛇广泛的C++库。

一个python类以pythonic的方式处理所有查询,通过调用python扩展模块用C++编写boost boost python。 python扩展执行C++代码,因此它可以链接和使用原始库中的任何内容。

你说你的C++是一个可执行文件,不过。为什么你不能使用系统调用来启动一个shell进程?你可以用任何语言来做到这一点,包括python。我认为你想访问单个函数,这意味着你需要静态库中的所有函数。

您可以正常构建您的C++ exe文件,链接公共代码。你制作了一个“boost python扩展模块”,它链接了常用的代码,并且可以通过python脚本导入。当然还有一个单元测试可执行文件,用于链接和测试通用代码。我的首选是通用代码是一个独立的静态库(如果有posix gcc版本,使用-fPic)。

+0

可能值得一提的是使用共享库(.dll/.so)作为一种可能性以及静态库的可能性。 –

+0

python扩展模块是(并且必须是)共享库(.pyd/.so)。底层代码库必须与(-fPic)兼容,但也要共享,这意味着您必须分发它,并且没有任何版本/接口不匹配。没有好处的风险。 –

+0

请注意,上面的答案提到将__static__库链接到python代码 - 这是错误的。您还可以为C++可执行文件和共享库构建一个静态库,并将其与python接口捆绑在一起。 –