【问题标题】:How I resolve Cppyy load_library giving Runtime error?如何解决 Cppyy load_library 给出运行时错误?
【发布时间】:2021-10-11 16:12:00
【问题描述】:

好的,根据我在这里找到的题为“从 Python 调用 C/C++?”的问题的答案。 here,以及在 cppyy 文档网站上,我在 .h 和 .cpp 文件中制作了一些示例类,并尝试将它们包含在 Python 中。虽然 .h 文件很容易包含在内,但当我尝试使用 cppyy.load_library() 函数时,由于某种原因它给了我一个运行时错误。有人可以帮忙吗?我试图在网上寻找解决方案,但显然以前没有人遇到过类似的问题。这就是我在 Jupyter Notebook 中运行的内容:

import cppyy
cppyy.include("foo.h")
cppyy.load_library("libfoo")

最后一行给了我以下错误:

RuntimeError                              Traceback (most recent call last)
<ipython-input-3-eea6173ad08e> in <module>
----> 1 cppyy.load_library("libfoo")

~\anaconda3\lib\site-packages\cppyy\__init__.py in load_library(name)
    219         sc = gSystem.Load(name)
    220     if sc == -1:
--> 221         raise RuntimeError('Unable to load library "%s"%s' % (name, err.err))
    222     return True
    223 

RuntimeError: Unable to load library "libfoo"

这是我的 .h 文件:

class Foo {
    public:
        void bar();
};

这是我的 .cpp 文件:

#include "foo.h"
#include <iostream>

void Foo::bar() { std::cout << "Hello" << std::endl; }

我正在使用命令g++ -c -fPIC foo.cpp -o foo.og++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o 来编译我的cpp 代码。

有人可以帮忙吗?

【问题讨论】:

  • 我要做的第一件事是确保库是 Python 正在寻找它的地方。 "libfoo" 对我来说就像它要搜索 working directory 然后 system path 一样。我也怀疑,但不确定,cppyy.load_library("libfoo") 应该是cppyy.load_library("libfoo.so")
  • 没有自动添加扩展。但是即使更改了系统路径,它仍然不起作用。既不使用add_library_path 函数也不使用os 模块在python 提示符下更改我的工作目录。我在这里完全一无所知

标签: python c++ python-3.x loadlibrary cppyy


【解决方案1】:

这个例子对我来说很好用。

要调试,首先确保在libfoo.so所在的同一目录下启动python,或者将libfoo.so所在的目录添加到LD_LIBRARY_PATH(供任何进程使用),或者调用@ 987654325@ 将路径作为参数添加,仅供cppyy 使用。至于名称,.so 扩展名会根据需要自动添加,lib 部分也是如此,因此foolibfoofoo.solibfoo.so 中的任何一个都可以。

如果仍然失败,在 Linux 上(仅)获取更多关于可能出错的信息的合理方法是使用 ctypes

$ python
>>> import cypes
>>> lib = ctypes.CDLL("libfoo.so")

如果存在不同的问题,例如缺少符号或缺少依赖库(但这里不是这种情况),它将显示您。

【讨论】:

  • 好的,事情是这样的,我在 Windows 系统上,所以我将我的目录添加到环境 PATH 变量中。当我尝试在 Jupyter Notebook 中使用 ctypes 加载库时,它可以正常工作而没有任何错误。但是,无论出于何种原因,它都不适用于cppyy.load_library()。我还尝试通过导入 os 模块然后使用它来更改工作目录来在命令提示符下执行此操作,但它不起作用。在更改 PATH 变量之前,我还尝试了 add_library_path 函数,但这仍然不起作用。我的路径是:“C:\Users\athar\Documents\Programming\C++ 程序”
  • 我还打开了一个新的 anaconda 提示符,将我的工作目录更改为上面提到的那个,在那里打开了 python。还是不行。
  • 我假设 Linux b/c 你在上面的命令中使用了 g++。我从未在 Windows 上尝试过 g++,只有 MSVC。请注意,对于 Windows,load_library 将查找 .dll 扩展名,而不是 .so,因此您必须明确并使用 libfoo.so 的全名。如果ctypes.CDLL 有效,那么您也可以使用ctypes.CDLL('libfoo.so', ctypes.RTLD_GLOBAL) 而不是cppyy.load_library()
  • 我试过了,但还是不行。另外,如果我使用cppyy.cppdef() 函数编写代码然后运行它,那仍然会给我带来 C++ 的高计算速度吗?因为老实说,我可以在编辑器中编写代码,对其进行测试,然后将其粘贴到 cppdef() 函数中。
  • 是的,cppdef 会生成优化代码,只是每次执行时都会编译,所以如果代码很大,加载库会更快。
猜你喜欢
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 2019-07-04
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 2021-10-20
相关资源
最近更新 更多