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

时间:2021-11-14 23:19:31
[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
>>>

I created the .so file as shown above but I'm not able to import inside python. what am I missing?

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

2 个解决方案

#1


8  

It must be called hello_world.so, not libhello_world.so.

它必须被称为hello_world.so,而不是libhello_world.so。

#2


13  

take that 'hello_world.so' file and and make new python file (in the same dir) named as 'hello_world.py'. Put the below code in it.. .

取'hello_world.so'文件并创建名为'hello_world.py'的新python文件(在同一目录中)。将以下代码放入其中..

def __bootstrap__():
   global __bootstrap__, __loader__, __file__
   import sys, pkg_resources, imp
   __file__ = pkg_resources.resource_filename(__name__,'hello_world.so')
   __loader__ = None; del __bootstrap__, __loader__
   imp.load_dynamic(__name__,__file__)
__bootstrap__()

now you can import this hello_world as:

现在你可以导入这个hello_world:

>>> import hello_world

#1


8  

It must be called hello_world.so, not libhello_world.so.

它必须被称为hello_world.so,而不是libhello_world.so。

#2


13  

take that 'hello_world.so' file and and make new python file (in the same dir) named as 'hello_world.py'. Put the below code in it.. .

取'hello_world.so'文件并创建名为'hello_world.py'的新python文件(在同一目录中)。将以下代码放入其中..

def __bootstrap__():
   global __bootstrap__, __loader__, __file__
   import sys, pkg_resources, imp
   __file__ = pkg_resources.resource_filename(__name__,'hello_world.so')
   __loader__ = None; del __bootstrap__, __loader__
   imp.load_dynamic(__name__,__file__)
__bootstrap__()

now you can import this hello_world as:

现在你可以导入这个hello_world:

>>> import hello_world