我的最后一个目标是从我的C++代码编译Python扩展。目前,为了开始工作,我正在遵循pybind11文档的第一步中的一个简单示例。我的工作环境是Windows7Professional 64位,mingw-w64 (x86_64-8.1.0-POSIX-seh_V6-rev0)和Python3.7.4 64位的Anaconda3。我有两个文件。第一个是C++文件-- example.cpp
#include <pybind11/pybind11.h>
int add(int i, int j) {
return i + j;
}
PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example plugin"; // optional module docstring
m.def("add", &add, "A function which adds two numbers");
}我使用以下命令编译C++文件:
C:/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/g++.exe -shared -std=c++11 -DMS_WIN64 -fPIC -ID:\Users\ADAS\anaconda3\Include -ID:\Users\ADAS\anaconda3\Library\include -ID:\Users\ADAS\anaconda3\pkgs\python-3.7.4-h5263a28_0\include -Wall -LD:\Users\ADAS\anaconda3\Lib -LD:\Users\ADAS\anaconda3\pkgs\python-3.7.4-h5263a28_0\libs example.cpp -o example.dll -lPython37编译结果是成功的,我正在获得example.dll文件。
在接下来的步骤中,我运行以下Python代码-- example.py:
import example
def main():
i, j = (1, 2)
res = example.add(i, j)
print("%d + %d = %d" % (i, j, res))
if __name__ == '__main__':
main()现在我有个问题。import example行似乎没有给我任何警告或错误,但是行res = example.add(i, j)给了我一个错误:
AttributeError: module 'example' has no attribute 'add'在Ubuntu18.04下,我成功地用Python编译并运行了上面的示例,但在我的办公室,我只有Windows 7。
问题:我的设置或命令行有什么问题?在Windows环境下,如果不更改当前的C++编译器(mingw-w64 version 8.1),是否有可能修复此问题?
发布于 2020-03-16 06:40:09
太不可思议了!问题只是编译文件的文件扩展名。当我将.dll更改为.pyd时,Python示例(example.py)正在运行,没有任何问题!
因此,新的命令行是:
C:/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/g++.exe -shared -std=c++11 -DMS_WIN64 -fPIC -ID:\Users\ADAS\anaconda3\Include -ID:\Users\ADAS\anaconda3\Library\include -ID:\Users\ADAS\anaconda3\pkgs\python-3.7.4-h5263a28_0\include -Wall -LD:\Users\ADAS\anaconda3\Lib -LD:\Users\ADAS\anaconda3\pkgs\python-3.7.4-h5263a28_0\libs example.cpp -o example.pyd -lPython37因为我对命令行参数做了一些实验,所以我将再次检查所有编译器参数,以确保它给出了成功的结果。如果还需要修改,我会通知你的。
Update1:
根据Python3默认设置,在C++下编译的C++文件的全部扩展名必须是.cp37-win_amd64.pyd。
我们可以通过终端命令获得分机:
python -c "from distutils import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX'))"这相当于python3-config --extension-suffix文档中的pybind11文档。python3-config脚本不是在Windows环境中实现的(至少在Anaconda3发行版中是如此)。
https://stackoverflow.com/questions/60699002
复制相似问题