c++ - gestion - ¿Cómo importar el módulo python desde el archivo.so?
importar clases en python (2)
Debe llamarse hello_world.so
, no libhello_world.so
.
[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
>>>
Creé el archivo .so como se muestra arriba, pero no puedo importar dentro de Python. ¿Qué me estoy perdiendo?
tome ese archivo ''hello_world.so'' y haga un nuevo archivo de Python (en el mismo directorio) llamado ''hello_world.py''. Ponga el siguiente código en él ...
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__()
Ahora puedes importar este hello_world como:
>>> import hello_world