我的最终目标是从我的C代码编译Python C扩展。目前,我正在按照pybind11
文档的第一步中的一个简单示例开始。我的工作环境是Windows 7专业版64位,mingw-w 64(x86_64-8.1.0-posix-seh-rt_v6-rev 0)和Anaconda 3,使用64位Python 3.7.4。我有两个文件。第一个是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'
在Ubuntu 18.04下,我成功地编译并运行了Python中的上述示例,但在我的办公室里,我只有Windows 7。
问题:我的设置或命令行有什么问题?是否可以在不改变Windows下当前C++编译器(mingw-w 64版本8.1)的情况下修复此问题?
1条答案
按热度按时间rjee0c151#
难以置信!问题仅仅是编译文件的文件扩展名。当我将
.dll
更改为.pyd
时,Python示例(example.py
)运行起来没有任何问题!因此,新命令行为:
因为我对命令行参数做了一些实验,所以我将再次检查所有的编译器参数,以确保它给出了成功的结果。如果仍然需要一些更改,我会让您知道。
更新1:
根据Python3的默认设置,在Windows下编译的C++文件的完整扩展名必须是
.cp37-win_amd64.pyd
。我们可以通过terminal命令获取扩展名:
这相当于pybind11文档中的
python3-config --extension-suffix
。python3-config
脚本在Windows环境中没有实现(至少在Anaconda3发行版中没有实现)。