简体   繁体   中英

Unable to install mysqlclient Python package on Windows

I am trying to install the mysqlclient Python package ( https://pypi.python.org/pypi/mysqlclient ) into a virtual Python 2.7 environment on Windows 7 (on a local PC, and on the Appveyor CI) and cannot get it done.

I am describing the issues for the local PC with Win 7, but it happens basically the same way on Appveyor.

Packages in my virtualenv when I start:

pip (9.0.1)
setuptools (36.6.0)
wheel (0.30.0)

pip install mysqlclient initially says:

. . .
running build_ext
building '_mysql' extension
error: Microsoft Visual C++ 9.0 is required. Get it from http://aka.ms/vcpython27

Apparently, Python 2.7 requires VC9. After installing it, pip install mysqlclient gets a little further, but misses include files:

. . .
building '_mysql' extension
creating build\temp.win-amd64-2.7
creating build\temp.win-amd64-2.7\Release
C:\Program Files (x86)\Common Files\Microsoft\Visual C++ for Python\9.0\VC\Bin\amd64\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -Dversion_info=(1,3,12,'final',0) -D__version__=1.3.12 "-IC:\Program Files (x86)\MySQL\MySQL Connector C 6.1\include" -IC:\Python27\include -IC:\Users\Andi\virtualenvs\mysqlclient\PC /Tc_mysql.c /Fobuild\temp.win-amd64-2.7\Release\_mysql.obj /Zl
_mysql.c
_mysql.c(29) : fatal error C1083: Cannot open include file: 'mysql.h': No such file or directory
error: command 'C:\\Program Files (x86)\\Common Files\\Microsoft\\Visual C++ for Python\\9.0\\VC\\Bin\\amd64\\cl.exe' failed with exit status 2

In order to get the header files, I installed the "MySQL Connector/C 6.1.10" from https://downloads.mysql.com/archives/get/file/mysql-connector-c-6.1.10-winx64.msi . This is admittedly only the second latest version, but I need to install it on Appveyor from the command line, and did not find out how to download the latest version in an unattended manner.

Also, using the MSI installer installs the package in C:\\Program Files\\MySQL\\MySQL Connector C 6.1 but the build step in pip install expects it in C:\\Program Files (x86)\\MySQL\\MySQL Connector C 6.1 , so I softlinked it:

mklink /D "C:\Program Files (x86)\MySQL\MySQL Connector C 6.1" "C:\Program Files\MySQL\MySQL Connector C 6.1"

When looking at the files in that version of the MySQL Connector/C, it has only lib/vs12 and lib/vs14 directories:

lib/vs12/mysqlclient.lib
lib/vs14/mysqlclient.lib

As expected, pip install mysqlclient now gets beyond the compiles, but fails when linking:

. . .
running build_ext
building '_mysql' extension
creating build\temp.win-amd64-2.7
creating build\temp.win-amd64-2.7\Release
C:\Program Files (x86)\Common Files\Microsoft\Visual C++ for Python\9.0\VC\Bin\amd64\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -Dversion_info=(1,3,12,'final',0) -D__version__=1.3.12 "-IC:\Program Files (x86)\MySQL\MySQL Connector C 6.1\include" -IC:\Python27\include -IC:\Users\Andi\virtualenvs\mysqlclient\PC /Tc_mysql.c /Fobuild\temp.win-amd64-2.7\Release\_mysql.obj /Zl
_mysql.c
_mysql.c(242) : .... several warnings ...
C:\Program Files (x86)\Common Files\Microsoft\Visual C++ for Python\9.0\VC\Bin\amd64\link.exe /DLL /nologo /INCREMENTAL:NO "/LIBPATH:C:\Program Files (x86)\MySQL\MySQL Connector C 6.1\lib\vs9" /LIBPATH:C:\Python27\Libs /LIBPATH:C:\Users\Andi\virtualenvs\mysqlclient\libs /LIBPATH:C:\Users\Andi\virtualenvs\mysqlclient\PCbuild\amd64 /LIBPATH:C:\Users\Andi\virtualenvs\mysqlclient\PC\VS9.0\amd64 kernel32.lib advapi32.lib wsock32.lib mysqlclient.lib /EXPORT:init_mysql build\temp.win-amd64-2.7\Release\_mysql.obj /OUT:build\lib.win-amd64-2.7\_mysql.pyd /IMPLIB:build\temp.win-amd64-2.7\Release\_mysql.lib /MANIFESTFILE:build\temp.win-amd64-2.7\Release\_mysql.pyd.manifest /MANIFEST
LINK : fatal error LNK1181: cannot open input file 'mysqlclient.lib'
error: command 'C:\\Program Files (x86)\\Common Files\\Microsoft\\Visual C++ for Python\\9.0\\VC\\Bin\\amd64\\link.exe' failed with exit status 1181

I did not find a version of the "MySQL Connector/C" package that can still be downloaded and that works with VC9. Using the mysqlclient.lib files in the vs12 or vs14 directories in this vc9 build results in unresolved symbols.

My questions are:

  • What package(s) do I need to use in order to get the right header files (eg mysql.h ) and libraries (eg mysqlclient.lib ) for a successful pip install mysqlclient on Windows 7?
  • More generally, what are the prerequisites for a successful pip install mysqlclient on Windows 7?

download mysqlclient from http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python

choose the version matching your python version, example mysqlclient‑1.4.2‑cp37‑cp37m‑win_amd64.whl, and then:

pip install wheel

pip install mysqlclient‑1.4.2‑cp37‑cp37m‑win_amd64.whl

Incidentally I ran into the same issue in July last year and only now finished an entry on my blog about it.

Basically, you're not going to like it, but you need to re-compile mysqlclient from scratch, because -- as you pointed out -- it's not available for Visual Studio 9 since a long time.

However, doing it right is somewhat tricky, because you need to fix some compilation issues that apparently aren't documented anywhere in Oracle's official documentation. There are also issues with the Python setup.py file, as it doesn't care about the platform architecture and always looks in the x86 directory. That's why you soft-linked the directory. There is an open issue on Github mentioning this.

So basically, using the VC++ for Python 2.7 you already installed:

  1. Download the Oracle MySQL C Connector source code.
  2. Download and install Microsoft Visual C++ Compiler for Python 2.7.
  3. Use CMake to generate NMake Makefiles for the MySQL C Connector source code. Pay attention to environment variables, see this Github issue comment .
  4. Compile the MySQL C Connector mysqlclient library using nmake mysqlclient .
  5. Install the MySQL C Connector binary and add the compiled mysqlclient.
  6. Run pip install mysqlclient again.

Step 4 is tricky, because Microsoft don't supply C99 stdint.h, inttypes.h and stdlib.h is missing lldiv_t. You can use this StackOverflow post to get stdint.h and inttypes.h and then manually define lldiv_t in decimal.h as:

typedef struct {
long long quot;
long long rem;
} lldiv_t;

You can also copy these headers from a newer Visual Studio, like 2013 and 2015. After that, as you had already figured out, you need to put the compiled mysqlclient.lib into C:\\Program Files (x86)\\MySQL\\MySQL Connector C 6.1\\lib\\vs9.

Then issue another pip install mysqlclient and you're all done.

使用来自https://www.lfd.uci.edu/~gohlke/pythonlibs/ 的mysqlclient‑1.4.6‑cp38‑cp38‑win32.whl for python 3.8

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM