概述
有不同的方法来用 C++ 扩展 Python:
Swig
使用 Boost.Python, 可选择使用 Py++ 预处理
使用 Cython.
Cython 出现之前, Boost.Python 是编写 C ++ 扩展模块最爽的方式.
Boost.Python 集成在 Boost C++ Libraries 中. 要在 Ubuntu 系统上安装;
- $ sudo apt-get install libboost-python-dev
- $ sudo apt-get install python-dev
快速入门
- hellomodule.cpp
- #include <iostream>
- using namespace std;
- void say_hello(const char* name) {
- cout <<"Hello" << name << "!\n";
- }
- #include <boost/python/module.hpp>
- #include <boost/python/def.hpp>
- using namespace boost::python;
- BOOST_PYTHON_MODULE(hello)
- {
- def("say_hello", say_hello);
- }
setup.py
- #!/usr/bin/env python
- # 技术支持 qq 群: 144081101 591302926 567351477 钉钉免费群: 21745728
- from distutils.core import setup
- from distutils.extension import Extension
- setup(name="PackageName",
- ext_modules=[
- Extension("hello", ["hellomodule.cpp"],
- libraries = ["boost_python"])
- ])
编译:
- python2.7 setup.py build
- running build
- running build_ext
- building 'hello' extension
- creating build/temp.Linux-x86_64-2.7
- x86_64-Linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fdebug-prefix-map=/build/python2.7-nbjU53/python2.7-2.7.15~rc1=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/usr/include/python2.7 -c hellomodule.cpp -o build/temp.Linux-x86_64-2.7/hellomodule.o
- cc1plus: warning: command line option '-Wstrict-prototypes' is valid for C/ObjC but not for C++
- creating build/lib.Linux-x86_64-2.7
- x86_64-Linux-gnu-g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -Wdate-time -D_FORTIFY_SOURCE=2 -g -fdebug-prefix-map=/build/python2.7-nbjU53/python2.7-2.7.15~rc1=. -fstack-protector-strong -Wformat -Werror=format-security -Wl,-Bsymbolic-functions -Wl,-z,relro -Wdate-time -D_FORTIFY_SOURCE=2 -g -fdebug-prefix-map=/build/python2.7-nbjU53/python2.7-2.7.15~rc1=. -fstack-protector-strong -Wformat -Werror=format-security build/temp.Linux-x86_64-2.7/hellomodule.o -lboost_python -o build/lib.Linux-x86_64-2.7/hello.so
执行:
- $ python2.7
- Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34)
- [GCC 7.3.0] on linux2
- Type "help", "copyright", "credits" or "license" for more information.
- >>> import hello
- >>> hello.say_hello("World")
- Hello World!
python3 怎么办?
- $ python3
- Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56)
- [GCC 7.2.0] on Linux
- Type "help", "copyright", "credits" or "license" for more information.
- >>> import hello
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- ImportError: /usr/lib/x86_64-Linux-gnu/libboost_python-py27.so.1.65.1: undefined symbol: PyClass_Type
setup.py
- #!/usr/bin/env python
- from distutils.core import setup
- from distutils.extension import Extension
- setup(name="PackageName",
- ext_modules=[
- Extension("hello", ["hellomodule.cpp"],
- libraries = ["boost_python"])
- ])
编译:
- $ python3 setup.py build
- running build
- running build_ext
- building 'hello' extension
- creating build
- creating build/temp.Linux-x86_64-3.6
- gcc -pthread -B /usr/local/anaconda/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/usr/local/anaconda/include/python3.6m -c hellomodule.cpp -o build/temp.Linux-x86_64-3.6/hellomodule.o
- cc1plus: warning: command line option '-Wstrict-prototypes' is valid for C/ObjC but not for C++
- creating build/lib.Linux-x86_64-3.6
- g++ -pthread -shared -B /usr/local/anaconda/compiler_compat -L/usr/local/anaconda/lib -Wl,-rpath=/usr/local/anaconda/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.Linux-x86_64-3.6/hellomodule.o -lboost_python3-py36 -o build/lib.Linux-x86_64-3.6/hello.cpython-36m-x86_64-Linux-gnu.so
执行:
- $ python3
- Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56)
- [GCC 7.2.0] on Linux
- Type "help", "copyright", "credits" or "license" for more information.
- >>> import hello
- >>> hello.say_hello("World")
- Hello World!
如何知道用哪个 python so?
$ ll /usr/lib/x86_64-Linux-gnu/libboost_python*.so
lrwxrwxrwx 1 root root 31 3 月 6 18:21 /usr/lib/x86_64-Linux-gnu/libboost_python3-py36.so -> libboost_python3-py36.so.1.65.1
lrwxrwxrwx 1 root root 24 3 月 6 18:21 /usr/lib/x86_64-Linux-gnu/libboost_python3.so -> libboost_python3-py36.so
lrwxrwxrwx 1 root root 30 3 月 6 18:21 /usr/lib/x86_64-Linux-gnu/libboost_python-py27.so -> libboost_python-py27.so.1.65.1
lrwxrwxrwx 1 root root 24 3 月 6 18:21 /usr/lib/x86_64-Linux-gnu/libboost_python-py36.so -> libboost_python3-py
来源: http://www.jianshu.com/p/8e3a50782915