Python mysqldb: Biblioteca não carregada: libmysqlclient.18.dylib

172

Acabei de compilar e instalar o mysqldb para python 2.7 no meu mac os 10.6. Criei um arquivo de teste simples que importa

import MySQLdb as mysql

Em primeiro lugar, este comando está sublinhado em vermelho e as informações dizem "Importação não resolvida". Então tentei executar o seguinte código python simples

import MySQLdb as mysql

def main():
    conn = mysql.connect( charset="utf8", use_unicode=True, host="localhost",user="root", passwd="",db="" )

if __name__ == '__main__'():
    main()

Ao executá-lo, recebo a seguinte mensagem de erro

Traceback (most recent call last):
  File "/path/to/project/Python/src/cvdv/TestMySQLdb.py", line 4, in <module>
    import MySQLdb as mysql
  File "build/bdist.macosx-10.6-intel/egg/MySQLdb/__init__.py", line 19, in <module>
    \namespace cvdv
  File "build/bdist.macosx-10.6-intel/egg/_mysql.py", line 7, in <module>
  File "build/bdist.macosx-10.6-intel/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so
  Reason: image not found

Qual pode ser a solução para o meu problema?

EDIT: Na verdade, descobri que a biblioteca está em / usr / local / mysql / lib. Então, preciso dizer à minha versão do pydev eclipse onde encontrá-la. Onde eu coloco isso?

toom
fonte

Respostas:

323

Resolvi o problema criando um link simbólico para a biblioteca. Ou seja,

A biblioteca real reside em

/usr/local/mysql/lib

E então eu criei um link simbólico no

/usr/lib

Usando o comando:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

para que eu tenha o seguinte mapeamento:

ls -l libmysqlclient.18.dylib 
lrwxr-xr-x  1 root  wheel  44 16 Jul 14:01 libmysqlclient.18.dylib -> /usr/local/mysql/lib/libmysqlclient.18.dylib

Foi isso. Depois disso tudo funcionou bem.

EDITAR:

Observe que, desde o MacOS El Capitan, a Proteção de integridade do sistema (SIP, também conhecida como "sem raiz") impedirá a criação de links /usr/lib/. Você pode desativar o SIP seguindo estas instruções , mas pode criar um link /usr/local/lib/:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
toom
fonte
47
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
hughes
Eu tinha instalado mysql55via MacPorts e para resolver este erro fez:sudo ln -s mysql/libmysqlclient.18.dylib /opt/local/lib/mysql55/libmysqlclient.18.dylib
philfreo
Depois Mavericks removido meu antigo link simbólico, eu tive que ligar simbolicamente a partir de um ponto ligeiramente diferente: sudo ln -s /usr/local/mysql-5.5.29-osx10.6-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Matt
2
Você precisará desativar o SIP se estiver executando o El Capitan: forums.developer.apple.com/thread/7935 .
21415 Joshua Pinter
Após uma nova instalação do El Capitan, descobri que você não precisa desativar o SIP para esta dica.
Lonoshea
135

Meu método preferido é realmente corrigir a biblioteca em vez de jogar com variáveis ​​de ambiente que podem ou não estar no escopo, dependendo de como o aplicativo é executado. Este é realmente um processo bastante simples.

Primeiro, observe a saída de erro para ver onde o módulo python incorreto está localizado:

ImportError: dlopen (/Library/Python/2.7/site-packages/_mysql.so, 2): Biblioteca não carregada: libmysqlclient.18.dylib Referenciado por: /Library/Python/2.7/site-packages/_mysql.so Motivo: imagem não encontrada

Ok, o arquivo incorreto é /Library/Python/2.7/site-packages/_mysql.so

Em seguida, descubra onde _mysql.so acha que deve encontrar o libmysqlclient.18.dylib:

% otool -L /Library/Python/2.7/site-packages/_mysql.so
/Library/Python/2.7/site-packages/_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 169.3.0)

Então, ele está procurando libmysqlclient.18.dylib sem informações de caminho, vamos corrigir isso:

% sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /Library/Python/2.7/site-packages/_mysql.so

Agora _mysql.so conhece o caminho completo para a biblioteca e tudo funciona, independentemente das variáveis ​​de ambiente.

% otool -L /Library/Python/2.7/site-packages/_mysql.so                                                                                           
/Library/Python/2.7/site-packages/_mysql.so:
    /usr/local/mysql/lib/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 169.3.0)
Caleb Shay
fonte
4
Essa não seria uma solução ainda melhor, por isso a corrige com todos os virtualenvs? sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib $ VIRTUAL_ENV / lib / python2.7 / site-packages / _mysql.so
Brad Ruderman
1
@BradRuderman Acho que é importante deixar claro que, quando você executa o comando que você forneceu, conserta apenas um virtualenv - o atual. Além disso, nem todo mundo está (em seu detrimento) executando em um virtualvv, de modo que a linha de comando não seria uma solução tão geral quanto a postada.
GreenAsJade
1
Nota importante: o exemplo dado está consertando o python / mysql global que você precisará consertar em cada um de seus Ambientes Virtuais. Se você é como eu, viu a primeira parte em que eles estão localizados _mysql.so é um passo importante.
Ben Rabidou
Isso funciona para _mysql.so instalado dentro do VirtualEnvironments e não requer a desativação do SIP no El Capitan.
Aaron D
Graças para a explicação @Caleb :) :) (Y)
Sachin Malhotra
59

Descobri que havia outra solução para esse problema, em vez de criar um link simbólico.

Você define o caminho para seu diretório, onde reside libmysqlclient.18.dylib, como variável de ambiente DYLD_LIBRARY_PATH. O que fiz foi colocar a seguinte linha no meu .bash_profile:

export DYLD_LIBRARY_PATH=/usr/local/mysql-5.5.15-osx10.6-x86/lib/:$DYLD_LIBRARY_PATH

É isso aí.

yoshi
fonte
7
há também um link simbólico em / usr / local / mysql que aponta para a versão instalada, então eu sugiro mudar sua linha para: DYLD_LIBRARY_PATH exportação = / usr / local / mysql / lib /: $ DYLD_LIBRARY_PATH
esgueirar-
37

No meu caso, estava recebendo o erro no Mac OS X 10.9 Mavericks. Instalei o MySQL Community Server diretamente do site Oracle / MySQL da DMG.

Tudo o que eu precisava fazer era vincular os arquivos lib ao diretório / usr / local / lib.

mkdir -p /usr/local/lib   
ln -s /usr/local/mysql/lib/libmysql* /usr/local/lib

Bônus: Se você também estiver executando o Mac OS X, há uma ótima ferramenta para localizar arquivos como o arquivo libmysqlclient.18.dylib, http://apps.tempel.org/FindAnyFile . Foi assim que encontrei originalmente o local do arquivo dylib.

Nick Woodhams
fonte
1
Eu tive que criar o /usr/local/libdiretório, mas funcionou como um encanto!
Nick Merrill
25

Descobri que colocar isso no seu .profile ou .bashrc (o que você usar) é a maneira mais fácil de fazer isso, os links sym são confusos em comparação com os caminhos dos arquivos de origem.

Também comparado com a resposta do yoshisurfs, na maioria das vezes quando o mysql é instalado, o diretório mysql deve ser renomeado para apenas mysql, não o nome completo do arquivo, para facilitar o uso.

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
Matthew Harrison
fonte
2
Parece uma resposta muito sã e simples. Funcionou bem para mim - obrigado!
Darragh Enright
4

Eu me deparei com isso em alguns ambientes virtuais.

pip uninstall MySQL-python
pip install -U MySQL-python

Trabalhou as duas vezes.

John Redford
fonte
Trabalhou para mim também
Tho
3

Para aqueles que usam homebrew, você pode corrigir isso com:

$ brew link mysql
keithpjolley
fonte
Isso funcionou para mim, criou um link como este: /usr/local/lib/libmysqlclient.18.dylib -> /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib
Joshua Grigonis
2

No meu caso, em El Capitan (OSX 10.11), devo fazer o seguinte em ~/.bash_profile

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:${DYLD_LIBRARY_PATH}"
export PATH="/usr/local/mysql/lib:${PATH}"
Krishna Sunuwar
fonte
2

quando você estiver em El Capitan, receberá um erro: é ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted necessário fechar o "System Integrity Protection".

primeiro, reinicie e segure cmd + R para entrar no modo de recuperação, inicie o terminal e digite o comando:, csrutil disableagora você pode reiniciar e tente novamente.

yannisxu
fonte
Outra forma que você pode mover o arquivo libmysqlclient.18.dylibpara /usr/local/libe adicionar caminho PATH=/usr/local/lib:$PATHpara bash_profile. Está funcionando para mim.
Bun Suwanparsert
1

Na nova instalação do El Capitan, em que o SIP (sem raiz impede o acesso a usr / lib /) está ativado por padrão e você não pode criar o link simbólico, a menos que esteja no modo de recuperação. Como o @yannisxu disse, você pode desativar o SIP e fazer o seu link simbólico para / usr / lib / local, e isso funcionará.

você pode usar o seguinte comando no MAC OSX El Capitan em vez de desativar o SIP:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib

Costumava haver uma opção em que você pode fazer login como root e isso pode desativar o SIP, mas na versão final agora obsoleta, você pode ler mais sobre isso aqui: https://forums.developer.apple.com/thread/4686

Questão:

Existe um comando nvram boot-args disponível no Developer Beta 1 que pode desativar o SIP quando executado com privilégios de root:

nvram boot-args="rootless=0"

Essa opção de desativar o SIP também estará disponível na versão do El Capitan? Ou isso é estritamente para o Developer Builds?

Responda:

Este comando nvram boot-args desaparecerá. Ele não estará disponível na versão de lançamento do El Capitan e poderá desaparecer antes do final do desenvolvedor Betas. Fique de olho nas notas de versão do futuro Developer Betas.

mrkzq
fonte
0

Eu tive esse problema e demorei um pouco para descobrir como consertar isso.

Meu caso é um pouco diferente. Meu servidor MySQL é da versão 5.1.x. E de alguma forma eu atualizei meu MySQL-python de 1.2.3 para 1.2.5. E eu continuava recebendo esse problema desde então, caso eu adicionasse o seguinte link.

libmysqlclient.18.dylib -> /usr/local/mysql/lib/libmysqlclient.18.dylib

Acontece que para o MySQL 5.1.x não existe libmysqlclient.18.dylib, mas apenas libmysqlclient.16.dylib. Você pode corrigir esse problema fazendo o downgrade do seu MySQL-python para 1.2.3 ou atualizando o servidor MySQL para 5.6.x (eu não tentei o 5.5.x.)

Fiz o downgrade da biblioteca para a versão 1.2.3, pois a atualização do MySQL não é uma opção para mim.

James J. Ye
fonte
0

vá para http://dev.mysql.com/downloads/connector/c/ e faça o download do MySQL Connector / C. depois de obter o pacote, crie um novo diretório 'mysql', descompacte o arquivo do Mysql Connector no diretório mysql e, em seguida, no mysql, crie outro diretório vazio 'build'.we usará' build 'para criar o MySQL Connector / C. cd build && cmake ../your-MySQL-Connector-source-dir make && make install após make install, você receberá um diretório chamado mysql em / usr / local. ele contém todos os cabeçalhos e bibliotecas que você precisa. vá para este diretório e copie os cabeçalhos e bibliotecas para os locais correspondentes.

user6643531
fonte
0

podes tentar:

sudo install_name_tool -change libmysqlclient.18.dylib /Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so`
Xiaolin Leo
fonte
0

Observe o bug do MySQL Connector / C no macOS (minha versão atual é 10.13.2), corrija o mysql_config e reinstale o mysqlclient ou o MySQL-python, aqui estão os detalhes

Woody Huang
fonte