使用 python3-config 的 Pybind11 编译不工作
Pybind11 compilation with python3-config not working
我想使用 Pybind11 将一个简单的 C++ 函数集成到 Python 中。
考虑以下虚拟函数的简单示例:
#include <vector>
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
namespace py = pybind11;
// Dummy function: return a vector of size n, filled with 1
std::vector<int> generate_vector(unsigned int n)
{
std::vector<int> dummy_vector;
for(int i = 0; i < n; i++) dummy_vector.push_back(1);
return dummy_vector;
}
// Generate the python bindings for this C++ function
PYBIND11_PLUGIN(example) {
py::module m("example", "Generate vector of size n");
m.def("generate_vector", &generate_vector, "Function generates a vector of size n.");
return m.ptr();
}
我将此代码存储在一个名为 example.cpp 的函数中
我在 Anaconda 中使用 Python 3.5.2。在 official documentation 之后,
我编译的脚本如下:
c++ -O3 -shared -std=c++11 -I /Users/SECSCL/anaconda3/include/python3.5m `python-config --cflags --ldflags` example.cpp -o example.so
我不确切知道 'python-config' 部分代表什么,但我知道它会导致问题。我尝试了三种选择:
- python-config:这会导致 clang 错误,链接器命令失败
- python3-config:与 python-config
相同的问题
python3.4-config:这实际上有效并创建了一个 example.so 文件。但是当我尝试从 python3.5 加载它时,出现错误
致命 Python 错误:PyThreadState_Get: 没有当前线程
总而言之,我的问题是:如何编译我的代码以便我可以从 python3.5 加载它?或者更准确地说:我必须用什么来替换 'python-config' 语句?
我能够在我的 macOS Sierra 2015 年初 MacBook Pro 上运行您的示例。
我使用了您的 example.cxx
代码,没有任何更改。
在编译模块之前,您必须确保 anaconda 环境处于活动状态,以便编译命令调用正确的 python-config
命令。
在我的例子中,这是通过以下方式完成的:source ~/miniconda3/bin/activate
——您显然必须将 miniconda3
替换为 anaconda3
。
现在 double-check 您的编译命令将调用正确的 python-config
通过执行以下操作: which python3.5-config
-- 这应该会告诉您它正在使用您的 anaconda3 python3.5-config
。
现在可以调用编译如下:
c++ -O3 -shared -std=c++11 -I $HOME/build/pybind11/include \
-I $HOME/miniconda3/include/python3.5m \
`python3.5m-config --cflags --libs` -L $HOME/miniconda3/lib/ \
example.cpp -o example.so
请注意,我必须将包含路径添加到我的 pybind11 结帐,指定确切的 python-config
版本 (3.5m),将 --ldflags
更改为 --libs
以便 python-config
不会添加会导致错误的 --stack-size
link 参数,最后我为包含 libpython3.5m.dylib
在此之后,我可以做:
$ python
Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul 2 2016, 17:52:12)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import example
>>> v = example.generate_vector(64)
>>> print(v)
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
...非常整洁!
我想使用 Pybind11 将一个简单的 C++ 函数集成到 Python 中。 考虑以下虚拟函数的简单示例:
#include <vector>
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
namespace py = pybind11;
// Dummy function: return a vector of size n, filled with 1
std::vector<int> generate_vector(unsigned int n)
{
std::vector<int> dummy_vector;
for(int i = 0; i < n; i++) dummy_vector.push_back(1);
return dummy_vector;
}
// Generate the python bindings for this C++ function
PYBIND11_PLUGIN(example) {
py::module m("example", "Generate vector of size n");
m.def("generate_vector", &generate_vector, "Function generates a vector of size n.");
return m.ptr();
}
我将此代码存储在一个名为 example.cpp 的函数中 我在 Anaconda 中使用 Python 3.5.2。在 official documentation 之后, 我编译的脚本如下:
c++ -O3 -shared -std=c++11 -I /Users/SECSCL/anaconda3/include/python3.5m `python-config --cflags --ldflags` example.cpp -o example.so
我不确切知道 'python-config' 部分代表什么,但我知道它会导致问题。我尝试了三种选择:
- python-config:这会导致 clang 错误,链接器命令失败
- python3-config:与 python-config 相同的问题
python3.4-config:这实际上有效并创建了一个 example.so 文件。但是当我尝试从 python3.5 加载它时,出现错误
致命 Python 错误:PyThreadState_Get: 没有当前线程
总而言之,我的问题是:如何编译我的代码以便我可以从 python3.5 加载它?或者更准确地说:我必须用什么来替换 'python-config' 语句?
我能够在我的 macOS Sierra 2015 年初 MacBook Pro 上运行您的示例。
我使用了您的 example.cxx
代码,没有任何更改。
在编译模块之前,您必须确保 anaconda 环境处于活动状态,以便编译命令调用正确的 python-config
命令。
在我的例子中,这是通过以下方式完成的:source ~/miniconda3/bin/activate
——您显然必须将 miniconda3
替换为 anaconda3
。
现在 double-check 您的编译命令将调用正确的 python-config
通过执行以下操作: which python3.5-config
-- 这应该会告诉您它正在使用您的 anaconda3 python3.5-config
。
现在可以调用编译如下:
c++ -O3 -shared -std=c++11 -I $HOME/build/pybind11/include \
-I $HOME/miniconda3/include/python3.5m \
`python3.5m-config --cflags --libs` -L $HOME/miniconda3/lib/ \
example.cpp -o example.so
请注意,我必须将包含路径添加到我的 pybind11 结帐,指定确切的 python-config
版本 (3.5m),将 --ldflags
更改为 --libs
以便 python-config
不会添加会导致错误的 --stack-size
link 参数,最后我为包含 libpython3.5m.dylib
在此之后,我可以做:
$ python
Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul 2 2016, 17:52:12)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import example
>>> v = example.generate_vector(64)
>>> print(v)
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
...非常整洁!