Embedded Python seems broken on Mac OS X Mountain LIon
I am trying to work with Apple Mountain Lion's install of Python 2.7. I have a language interoperability tool, Babel http://www.llnl.gov/CASC/components/, that used embedded Python when other languages are calling Python (c.g., C++ calling Python). My fundamental problem is that sys.path is not being initialized the same when I dlopen(libpython2.7.dylib) and initialize Python compared with how the sys.path is set when the Python executable is called directly. This causes Python to fail to load the numpy module used by Babel.
bash-3.2$ /usr/bin/python2.7 -c "import sys; print sys.path; import numpy" > /tmp/out1 bash-3.2$ /usr/bin/python -c "import sys; print sys.path; import numpy"
/tmp/out2 bash-3.2$ cat /tmp/out1 ['', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', '/Library/Python/2.7/site-packages'] bash-3.2$ diff /tmp/out1 /tmp/out2 bash-3.2$ ls -al /usr/bin/python2.7 lrwxr-xr-x 1 root wheel 75 Aug 23 11:10 /usr/bin/python2.7 -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
Presumably, this C program that uses dlopen(), Py_Initialize, and Py_SimpleString should have exactly the same output.
/** foo.c */ #include <dlfcn.h> #include <stdio.h>
int main(int argc, char **argv) { // void *lptr = dlopen("/System/Library/Frameworks/Python.framework/Python", RTLD_NOW | RTLD_GLOBAL); void *lptr = dlopen("/System/Library/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib", RTLD_NOW | RTLD_GLOBAL); if (lptr) { void (*pyinit)(void) = dlsym(lptr, "Py_Initialize"); if (pyinit) { int (*runSimple)(const char *); (*pyinit)(); /* initialize Python */ runSimple = dlsym(lptr, "PyRun_SimpleString"); if (runSimple) { (*runSimple)("import sys ; print sys.path; import numpy"); } } else { fprintf(stderr, "Unable to locate Py_Initialize: %s\n", dlerror()); } } else { fprintf(stderr, "Error loading Python shared library: %s\n", dlerror()); } }
bash-3.2$ gcc foo.c ; ./a.out ['/usr/lib/python27.zip', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-darwin', '/usr/lib/python2.7/plat-mac', '/usr/lib/python2.7/plat-mac/lib-scriptpackages', '/usr/Extras/lib/python', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload'] Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named numpy
However as you see, it has a completely different sys.path. I can't seem to find a way to get it to initialize Python with the same sys.path. It seems like the libpython2.7.dylib is broken. I am at a loss on how to fix this or even who to ask for help.
Regards,
Tom Epperly
participants (1)
-
Tom Epperly