mysql-python:在Mac OS X上构建完全独立的_mysql.so?

1 投票
2 回答
1847 浏览
提问于 2025-04-15 17:24

我在一个Linux虚拟机(Ubuntu 9.10)上运行数据库服务器,同时在Mac上编写Django代码。安装mysql-python需要在Mac上安装MySQL,以便把_mysql.so编译到site-packages里。

不过,完成这个后,我在Mac上就不再需要MySQL了,想把它删掉。当然,这样做是不行的,因为_mysql.so需要/usr/local/mysql/lib/libmysqlclient_r.16.dylib这个文件。

mysql-python的site.cfg里有一个“static”选项,如果把它设置为“true”,会让_mysql.so文件变得很大,但它还是依赖于这个.dylib文件。

有没有办法让这个.so文件完全不依赖于MySQL的安装呢?即使这样做会让文件变得非常大也没关系。

如果有解决方案的话,最好能在10.5和10.6这两个版本上都能用,因为我暂时会在不同的机器上使用这两个版本。

2 个回答

3

我来到这里是想在一个老旧的Linux系统上构建一个静态的MySQLdb。我发现MySQL已经转向使用cmake了:

我能够这样构建一个静态的mysql:

# set INSTALL to taste, run from where you extracted the tar file
SOURCE=$(pwd) && mkdir bld && cd bld &&
cmake -DCMAKE_INSTALL_PREFIX=$INSTALL -DWITH_PIC=ON -DDISABLE_SHARED=ON \
      -DDEFAULT_CHARSET=utf8 -DEXTRA_CHARSETS=ascii,binary,latin1 \
      -DDEFAULT_COLLATION=utf8_general_ci \
      $SOURCE

注意到“WITH_PIC=ON”和“DISABLE_SHARED=ON”,这看起来有点反直觉,但为了构建可以动态加载的MySQLdb Python模块,所有的MySQL静态库都需要使用-fPIC选项来构建。

3

没关系,我自己查了一下,发现其实很简单。我把解决方案记录下来,以备其他人需要时参考:

  1. 从mysql.com下载MySQL的源代码压缩包(不要下载特定平台的二进制压缩包)

  2. 解压缩后,运行 ./configure,根据你的需求选择合适的选项,但一定要加上 --enable-static。为了保险起见,我还加了 --disable-shared,虽然可能不是绝对必要的。以下是我使用的命令,你的可能会有所不同:

    $ ./configure --prefix=/usr/local/mysql-src/ --enable-static --disable-shared --with-charset=utf8 --with-extra-charsets=ascii,binary,latin1 --with-collation=utf8_general_ci
    $ make
    $ sudo make install

    (关于这里的字符集和排序规则参数:在这个使用场景下,它们可能完全不必要,因为我之后会删除MySQL,但由于所有客户端连接都使用某种字符集/排序规则,我还是考虑到UTF-8,以防 _mysql.so 的编译方式影响了MySQLdb使用的默认字符集/排序规则——比我更聪明的人可能想确认这一点。)

  3. http://pypi.python.org/pypi/MySQL-python 下载最新的mysql-python源代码压缩包

  4. 解压缩后,在 site.cfg 文件中设置 static = Truemysql_config = /usr/local/mysql-src/bin/mysql_config(或者你在 configure 时选择的路径)。

  5. 运行 python setup.py build。编译结束时可能会出现一些与架构相关的错误,但可以忽略。

  6. 运行 sudo python setup.py install。这会在你的 site-packages 目录中创建一个 .egg 文件,并将其添加到 easy_install.pth 文件中。

  7. 完成了!你现在可以删除所有MySQL的痕迹以及mysql-python的源代码。这个egg文件可以直接复制到其他运行相同版本OS X的Mac上。现在我正开心地把它复制到用 virtualenv 创建的各种虚拟环境中。

这个方法在10.5上有效,我会很快在10.6上测试,如果有什么需要不同处理的地方,会在这里报告结果。

撰写回答