How to import python module from .so file?

91,255

Solution 1

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

Solution 2

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.. .

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:

>>> import hello_world
Share:
91,255
balki
Author by

balki

A computer enthusiast.

Updated on July 09, 2022

Comments

  • balki
    balki almost 2 years
    [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?

  • balki
    balki almost 12 years
    thanks. Now I get ImportError: ./hello_world.so: undefined symbol: _ZNK12boost_1_47_06python7objects21py_function_impl_base9max‌​_arityEv
  • Cat Plus Plus
    Cat Plus Plus almost 12 years
    @balki: You didn't link with Boost.Python.
  • balki
    balki almost 12 years
    I linked against boost_python, Now I get ImportError: libboost_python: cannot open shared object file: No such file or directory. If I export LD_LIBRARY_PATH=/path/to/boost_python_lib, it works fine. How do I specify in cmdline?
  • eudoxos
    eudoxos almost 12 years
    LD_LIBRARY_PATH=/path/to/boost_python_lib python would be straightforward. I'd suggest you symlink boost_python_lib to /usr/local/lib if you can, then you get it hassle-free. You can also hardcode the path in the .so file by passing -Wl,-rpath=/path/to/boost_python_lib to the compiler (which is actually processed by the linker).
  • Jay West
    Jay West over 8 years
    Should "_bootstrap_" be renamed to, say "_bootstrap"? I spent a lot of time trying to find the documentation for it, thinking it was a special reserved word, but I couldn't find anything. From python.org/dev/peps/pep-0008/#naming-conventions: _double_leading_and_trailing_underscore_ : "magic" objects or attributes that live in user-controlled namespaces. E.g. _init_ , _import_ or _file_ . Never invent such names; only use them as documented.
  • user765443
    user765443 over 6 years
    we can copy but can u add some detail about info.How does it work.
  • sancho.s ReinstateMonicaCellio
    sancho.s ReinstateMonicaCellio about 6 years
    I tried this with module readline. I happen to have a python version #1 (2.7.12) installed with apt-get, which has readline, and another version #2 (2.7.11), simply expanded, which does not. So I added a readline.py in one of the directories in sys.path for version #2, and a symlink in the same dir to /usr/lib/python2.7/lib-dynload/readline.x86_64-linux-gnu.so from version #1. I still get the error.
  • mLstudent33
    mLstudent33 over 4 years
    is this the only solution? I don't see this any Cython documentation so it feels like a workaround.