小能豆

如何从.so文件导入python模块?

python

[me@hostname python]$ cat hello_world.cc
#include <string>
#include <Python.h>
#include <boost/python.hpp>

namespace {
  std::string greet() { return "Helloworld"; }
}

using namespace boost::python;

BOOST_PYTHON_MODULE(hello_world)
{
  def("greet",greet);
}

[me@hostnmae python]$ g++ -c -fPIC hello_world.cc -I/path/to/boost/headers -I/path/to/python/headers -o hello_world.o
[me@hostname python]$ g++ -shared -Wl,-soname,libhello_world.so -o libhello_world.so  hello_world.o
[me@hostname python]$ python
Python 2.7.1 (r271:86832, Jan 10 2011, 09:46:57)
[GCC 3.4.5 20051201 (Red Hat 3.4.5-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append('.')
>>> import hello_world
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named hello_world
>>>

我创建了如上所示的 .so 文件,但无法在 python 中导入。我缺少什么?


阅读 144

收藏
2024-05-15

共1个答案

小能豆

您的代码看起来应该是正确的,并且按照您所描述的步骤进行编译也没有问题。但是,您在尝试导入 hello_world 模块时遇到了 ImportError。

这可能是由于以下一些常见原因引起的:

  1. 模块路径问题:确保 libhello_world.so 文件位于 Python 解释器可以找到的路径中。您可以在 Python 中运行以下命令来检查模块搜索路径:

    python import sys print(sys.path)

    确保 libhello_world.so 文件所在的目录出现在输出的列表中的其中一个路径中。

  2. Python 版本不匹配:在编译 hello_world 模块时使用的 Python 版本与您尝试导入模块时使用的 Python 版本不匹配。请确保您在编译模块时使用了正确版本的 Python。

  3. 链接库问题:如果您使用了依赖于 Boost.Python 的代码,确保正确链接了 Boost.Python 库。检查编译和链接命令中的路径和选项是否正确。

  4. 依赖问题:如果 hello_world 模块依赖于其他库,请确保这些库在加载模块时能够正确找到并链接。

尝试解决上述问题中的每一个,如果问题仍然存在,请检查错误消息中提供的更多细节,以了解导入失败的原因。

2024-05-15