[issue15498] Eliminate the use of deprecated OS X APIs in getpath.c

Ronald Oussoren report at bugs.python.org
Fri Oct 26 11:17:32 CEST 2012


Ronald Oussoren added the comment:

Apple seems to have switched to using dlopen in their version of getpath.c (see <http://www.opensource.apple.com/source/python/python-60.3/2.7/fix/getpath.c.ed>, this is the version in OSX 10.8.2)

This causes a problem for some people, as noticed on the pythonmac mailing list. This is something we should test before applying my patch to avoid regressions.

Message-Id: <508951D3.7080805 at llnl.gov> says:

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.

----------

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue15498>
_______________________________________


More information about the Python-bugs-list mailing list