【发布时间】:2020-11-13 04:18:54
【问题描述】:
我试图使用 PYbind 11 将以下小型 C++ 测试程序包装到 Python 模块中,这样我就可以从 python 文件中调用测试 C++ 函数。 我的问题是:虽然 C++ 文件编译成功,但我不知道下一步要采取什么步骤在 python 中导入新创建的模块文件。 我试图在 Spyder 的测试 Python 文件中运行“从示例导入添加”,但收到错误消息说没有名为示例的模块。 我正在使用 Windows10 (x64bit)、Python3.7 和 Visual Studio 2017 社区。 有人可以帮忙吗?非常感谢!
#include
//#include <Aspose.Cells.h>
#include <pybind11/pybind11.h>
void print(const char*);
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");
}
int main()
{
const char *x = "C Plus plus is wonderful.";
char *z;
char b = 'z';
z = &b;
int num = 10;
int* a = 0;
print(x);
}
void print(const char* z)
{
std::cout << "pointer z is" << z << "\n";
std::cin.get();
}
更新:在构建我的测试 C++ 程序时,我遵循了以下 Stuart 的建议。我做了两次尝试:第一次尝试时,我将 Target Extension 更改为“.pyd”;而在第二次尝试时,我将 Target Extension 保留为“dll”。
在两次尝试中,我都收到了来自 Visual Studio 的相同错误消息,这似乎表明正在构建的 DLL 文件无法启动(如紧随其后的屏幕截图所示) Error Messages for Starting DLL Programme 但是,实际构建 dll 文件似乎是成功的,因为我可以看到一个 dll 文件和一个 Python 扩展模块文件,文件名和路径如下所示: C:\Users\rmili\source\repos\ConsoleApplication5\x64\Debug\ConsoleApplication5.dll 和 C:\Users\rmili\source\repos\ConsoleApplication5\x64\Debug\ConsoleApplication5
构建时的 Visual Studio 输出消息粘贴在末尾。
我的问题是:我在同一个目录(C:\Users\rmili\source\repos\ConsoleApplication5\x64\Debug)中创建了一个Test.py文件 并尝试在仅包含一行命令“导入示例”后在 Spyder 中运行它。 Sypder 返回了一条错误消息,说“没有 MODULE Named Example”。
有人可以帮忙吗?非常感谢!
1>------ Build started: Project: ConsoleApplication5, Configuration: Debug x64 ------
1>LINK : C:\Users\rmili\source\repos\ConsoleApplication5\x64\Debug\ConsoleApplication5.dll not found or not built by the last incremental link; performing full link
1> Creating library C:\Users\rmili\source\repos\ConsoleApplication5\x64\Debug\ConsoleApplication5.lib and object C:\Users\rmili\source\repos\ConsoleApplication5\x64\Debug\ConsoleApplication5.exp
1>ConsoleApplication5.vcxproj -> C:\Users\rmili\source\repos\ConsoleApplication5\x64\Debug\ConsoleApplication5.dll
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
UPDATE2:我按照 Stuart 在他的 Update2 中的说明进行了每一个细节。 我得到了 example.pyd(如以下屏幕截图所示) 但是,我在 Spyder 中运行时收到错误消息,如下所示: (对不起,我只复制了 Spyder 输出消息的后半部分,因为它很难在 Spyder 控制台中进行文本选择)
File "C:\Users\rmili\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/rmili/source/repos/ConsoleApplication5/x64/Debug/Test.py", line 9
d = "C:\Users\rmili\source\repos\ConsoleApplication5\x64\Debug"
^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
我将分配给“d”的值中的反斜杠“”更改为正斜杠“/”,并再次收到以下错误:
File "C:\Users\rmili\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/rmili/source/repos/ConsoleApplication5/x64/Debug/Test.py", line 12, in <module>
import example
ModuleNotFoundError: No module named 'example'
更新3: 如以下屏幕截图所示,在 Windows 命令行提示符下找不到示例模块。 [Unable to find example module in Windowscommand line prompt]3
【问题讨论】:
标签: python c++ c build pybind11