Some details on this finally.
FWIW, this may be a MySQL 5.5 issue.
At least I used to do this on MySQL 5.1 and had no problems at all. I
have though since upgraded to MySQL 5.5 and see potential for
problems.
If you try and build MySQL client lib and don't have MySQL bin
directory in path it will fail with:
$ python setup.py build
sh: mysql_config: command not found
Traceback (most recent call last):
File "setup.py", line 15, in <module>
metadata, options = get_config()
File "/Users/graham/Packages/MySQL-python-1.2.3/setup_posix.py",
line 43, in get_config
libs = mysql_config("libs_r")
File "/Users/graham/Packages/MySQL-python-1.2.3/setup_posix.py",
line 24, in mysql_config
raise EnvironmentError("%s not found" % (mysql_config.path,))
EnvironmentError: mysql_config not found
If however the MySQL bin directory is in path you would on MacOS X
10.6 (Snow Leopard) get:
$ PATH=/usr/local/mysql/bin:$PATH python setup.py build
running build
running build_py
creating build
creating build/lib.macosx-10.6-universal-2.6
copying _mysql_exceptions.py -> build/lib.macosx-10.6-universal-2.6
creating build/lib.macosx-10.6-universal-2.6/MySQLdb
copying MySQLdb/__init__.py -> build/lib.macosx-10.6-universal-2.6/MySQLdb
copying MySQLdb/converters.py -> build/lib.macosx-10.6-universal-2.6/MySQLdb
copying MySQLdb/connections.py -> build/lib.macosx-10.6-universal-2.6/MySQLdb
copying MySQLdb/cursors.py -> build/lib.macosx-10.6-universal-2.6/MySQLdb
copying MySQLdb/release.py -> build/lib.macosx-10.6-universal-2.6/MySQLdb
copying MySQLdb/times.py -> build/lib.macosx-10.6-universal-2.6/MySQLdb
creating build/lib.macosx-10.6-universal-2.6/MySQLdb/constants
copying MySQLdb/constants/__init__.py ->
build/lib.macosx-10.6-universal-2.6/MySQLdb/constants
copying MySQLdb/constants/CR.py ->
build/lib.macosx-10.6-universal-2.6/MySQLdb/constants
copying MySQLdb/constants/FIELD_TYPE.py ->
build/lib.macosx-10.6-universal-2.6/MySQLdb/constants
copying MySQLdb/constants/ER.py ->
build/lib.macosx-10.6-universal-2.6/MySQLdb/constants
copying MySQLdb/constants/FLAG.py ->
build/lib.macosx-10.6-universal-2.6/MySQLdb/constants
copying MySQLdb/constants/REFRESH.py ->
build/lib.macosx-10.6-universal-2.6/MySQLdb/constants
copying MySQLdb/constants/CLIENT.py ->
build/lib.macosx-10.6-universal-2.6/MySQLdb/constants
running build_ext
building '_mysql' extension
creating build/temp.macosx-10.6-universal-2.6
gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -DNDEBUG -g -fwrapv
-Os -Wall -Wstrict-prototypes -DENABLE_DTRACE -pipe
-Dversion_info=(1,2,3,'final',0) -D__version__=1.2.3
-I/usr/local/mysql/include
-I/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6
-c _mysql.c -o build/temp.macosx-10.6-universal-2.6/_mysql.o -Os -g
-fno-common -fno-strict-aliasing -arch x86_64
In file included from _mysql.c:36:
/usr/local/mysql/include/my_config.h:329:1: warning: "SIZEOF_SIZE_T" redefined
In file included from
/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/Python.h:9,
from pymemcompat.h:10,
from _mysql.c:29:
/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/pymacconfig.h:33:1:
warning: this is the location of the previous definition
In file included from _mysql.c:36:
/usr/local/mysql/include/my_config.h:422:1: warning: "HAVE_WCSCOLL" redefined
In file included from
/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/Python.h:8,
from pymemcompat.h:10,
from _mysql.c:29:
/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/pyconfig.h:803:1:
warning: this is the location of the previous definition
gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup
build/temp.macosx-10.6-universal-2.6/_mysql.o -L/usr/local/mysql/lib
-lmysqlclient_r -lpthread -o
build/lib.macosx-10.6-universal-2.6/_mysql.so -arch x86_64
Important to note here is that it links against "-lmysqlclient_r".
The "_r" version is reentrant and is what should be used if running
multithread process.
Which library is linked is dependent on code defined in
'setup_posix.py' of the MySQL package.
In that file it has:
def get_config():
import os, sys
from setup_common import get_metadata_and_options, enabled,
create_release_file
metadata, options = get_metadata_and_options()
if 'mysql_config' in options:
mysql_config.path = options['mysql_config']
extra_objects = []
static = enabled(options, 'static')
if enabled(options, 'embedded'):
libs = mysql_config("libmysqld-libs")
client = "mysqld"
elif enabled(options, 'threadsafe'):
libs = mysql_config("libs_r")
client = "mysqlclient_r"
if not libs:
libs = mysql_config("libs")
client = "mysqlclient"
else:
libs = mysql_config("libs")
client = "mysqlclient"
The flags actually come from site.cfg which has by default:
[options]
# embedded: link against the embedded server library
# threadsafe: use the threadsafe client
# static: link against a static library (probably required for embedded)
embedded = False
threadsafe = True
#threadsafe = False
static = False
So, by default if build package from source yourself (not using pip)
it should find threadsafe and link against _r version of library.
For MySQL 5.5 at least:
$ ls -las /usr/local/mysql/lib
total 368624
0 drwxr-xr-x 12 root wheel 408 31 Oct 14:23 .
0 drwxr-xr-x 16 root wheel 544 12 Oct 23:21 ..
7400 -rwxr-xr-x 1 root wheel 3787624 12 Oct 23:19 libmysqlclient.18.dylib
19552 -rw-r--r-- 1 root wheel 10008760 12 Oct 23:19 libmysqlclient.a
8 lrwxr-xr-x 1 root wheel 23 31 Oct 14:23
libmysqlclient.dylib -> libmysqlclient.18.dylib
8 lrwxr-xr-x 1 root wheel 20 31 Oct 14:23
libmysqlclient_r.18.dylib -> libmysqlclient.dylib
8 lrwxr-xr-x 1 root wheel 16 31 Oct 14:23
libmysqlclient_r.a -> libmysqlclient.a
8 lrwxr-xr-x 1 root wheel 20 31 Oct 14:23
libmysqlclient_r.dylib -> libmysqlclient.dylib
175552 -rw-r--r-- 1 root wheel 89879064 12 Oct 23:16 libmysqld-debug.a
166064 -rw-r--r-- 1 root wheel 85023840 12 Oct 23:19 libmysqld.a
24 -rw-r--r-- 1 root wheel 8488 12 Oct 23:19 libmysqlservices.a
0 drwxr-xr-x 14 root wheel 476 12 Oct 23:21 plugin
Under MySQL 5.1 am pretty sure the _r library wasn't a symlink.
Changing site.cfg to not say threadsafe and ensure -l option matches
library used makes no difference.
So basically this looks like an issue with how MySQL 5.5 libraries are
built. There didn't used to be an issue with MySQL 5.1.
FWIW, I now get:
$ otool -L build/lib.macosx-10.6-universal-2.6/_mysql.so
build/lib.macosx-10.6-universal-2.6/_mysql.so:
libmysqlclient.18.dylib (compatibility version 18.0.0, current version
18.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current
version 125.2.11)
Under 5.1 it used to resolve the library no problem.
I will have to rebuild my MySQL Python client library properly at some
point and will look more at the problem then.
Graham
On 20 November 2011 23:00, mathew davis <[email protected]> wrote:
> Thanks Graham,
>
> the current solution at least allows me to get on with other
> development work,
> and I'd be happy to try and help resolve this when you can.
>
> Mat
>
> On Nov 20, 6:45 am, Graham Dumpleton <[email protected]>
> wrote:
>> Sorry for not replying, but I have lost Internet access at home and may not
>> get it back for a few more days.
>>
>> Right now you are treating the symptom and not the cause.
>>
>> What you have may still not work reliably because the extension is only
>> linked with single threaded version of MySQL library and not the re entrant
>> _r version.
>>
>> Not linking with _r version would be caused by MySQL config script not
>> being found or not running properly when pip was run to install module.
>>
>> I would like to sort this out properly still when I get my Internet back.
>>
>> Graham
>>
>> On Saturday, 19 November 2011, Simon Kesenci <[email protected]> wrote:
>> > I've solved this with install_name_tool:
>>
>> > sudo install_name_tool -change libmysqlclient.16.dylib
>>
>> /full/path/to/libmysqlclient.16.dylib {file which can't load dylib}
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> > --S.
>>
>> > On Nov 18, 2011, at 16:33, Graham Dumpleton <[email protected]>
>> wrote:
>>
>> >> This is an issue with how MySQLdb Python module is built. Can you tell
>> >> me how you installed it?
>>
>> >> Did you use pip, or did you download package as tar.gz and run setup.py
>> in it?
>>
>> >> I have tried twice before to sort this out with people on IRC but they
>> >> would not do what I asked them to help me solve it properly. I am at
>> >> least most of the way along sorting out what the issue is however. :-)
>>
>> >> Graham
>>
>> >> On 19 November 2011 08:41, mathew davis <[email protected]> wrote:
>> >>> I am trying to run django on osx 10.7 (lion) with apache mod_wsgi and
>> >>> virtualenv.
>> >>> My site works if I use the django testing server:
>>
>> >>>> (baseline)otter:hello mathew$ python manage.py runserver
>>
>> >>> but it doesn't work when I run apache. The core of the error seems to be
>>
>> >>>> Library not loaded: libmysqlclient.16.dylib
>>
>> >>> I think its to do with the path apache is using to locate
>> >>> libmysqlclient.16.dylib
>>
>> >>> when I run otool in the lib directory it looks good
>>
>> >>>> otter:lib mathew$ pwd
>> >>>> /usr/local/mysql/lib
>>
>> >>>> otter:lib mathew$ otool -L libmysqlclient.16.dylib
>> >>>> libmysqlclient.16.dylib:
>> >>>> libmysqlclient.16.dylib (compatibility version 16.0.0,
>> current
>> >>>> version 16.0.0)
>> >>>> /usr/lib/libSystem.B.dylib (compatibility version 1.0.0,
>> >>>> current version 125.0.1)
>>
>> >>> but from outside it can't find it
>>
>> >>>> otter:lib mathew$ cd /
>> >>>> otter:/ mathew$ otool -L libmysqlclient.16.dylib
>> >>>> otool: can't open file: libmysqlclient.16.dylib (No such file or
>> >>>> directory)
>>
>> >>> if i manually set DYLD_LIBRARY_PATH otool works
>>
>> >>>> otter:lib mathew$ DYLD_LIBRARY_PATH=/usr/local/mysql/lib otter:lib
>> >>>> mathew$ otool -L libmysqlclient.16.dylib libmysqlclient.16.dylib:
>> >>>> libmysqlclient.16.dylib (compatibility version 16.0.0, current
>> >>>> version 16.0.0) /usr/lib/libSystem.B.dylib (compatibility version
>> >>>> 1.0.0, current version 125.0.1)
>>
>> >>> When I run the django testing server, my .bash_profile sets up the
>> >>> virtualenv and the path to the mysql dynamic library
>>
>> >>>> export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/:$DYLD_LIBRARY_PATH
>> >>>> export PATH
>>
>> >>> When i run apache it finds my virtualenv paths, but it doesn't seem to
>> find
>> >>> the dynamic library path.
>>
>> >>> I tried adding this path to /usr/sbin/envvars
>>
>> DYLD_LIBRARY_PATH="/usr/lib:/usr/local/mysql/lib:$DYLD_LIBRARY_PATH">>>>
>> export DYLD_LIBRARY_PATH
>>
>> >>> and to /private/etc/paths.d/libmysql
>>
>> >>>> /usr/local/mysql/lib
>>
>> >>> then restarted the machine
>> >>> but that has not changed the error message.
>>
>> >>>> Error loading MySQLdb module:
>>
>> dlopen(/usr/local/python_virtualenv/baseline/lib/python2.7/site-packages/_mysql.so,
>>
>>
>>
>>
>>
>>
>>
>> >>>> 2):
>> >>>> Library not loaded: libmysqlclient.16.dylib
>>
>> >>> I don't think is a permissions issue:
>>
>> >>>> -rwxr-xr-x 1 root wheel 3787328 4 Dec 2010
>> >>>> libmysqlclient.16.dylib
>>
>> >>>> drwxr-xr-x 39 root wheel 1394 18 Nov 21:07 /
>> >>>> drwxr-xr-x@ 15 root wheel 510 24 Oct 22:10 /usr
>> >>>> drwxrwxr-x 20 root admin 680 2 Nov 20:22 /usr/local
>
> --
> You received this message because you are subscribed to the Google Groups
> "modwsgi" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/modwsgi?hl=en.
>
>
--
You received this message because you are subscribed to the Google Groups
"modwsgi" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/modwsgi?hl=en.