简单粗暴,直接如题。
安装mysqlclient==1.4.2.post1版本时,提示:MySQLdb/_mysql.c(29): fatal error C1083: Cannot open include file: \'mysql.h\': No such file or directory
按照提示需要安装MySQL Connecter/C,去官网下载MySQL installer,MySQL完整安装实在太大了,此处没有必要。所以选择custom安装,找到MySQL Connecter/C,分为x86和64两种,这里建议安装x86版本的,原因是在site.cfg中默认配置的是x86的路径(当然也可以修改这个配置),详情见下文。
安装后,再次执行安装,发现仍然报错。
到MySQL Connecter/C安装目录看,在include下是有mysql.c文件的。
下载mysqlclient==1.4.2.post1的源码包,查看setup.py,发现有如下代码:
def get_config(): from setup_common import get_metadata_and_options, enabled, create_release_file metadata, options = get_metadata_and_options() connector = options["connector"] extra_objects = [] # client = "mysqlclient" client = "mariadbclient" vcversion = int(get_build_version()) if client == "mariadbclient": library_dirs = [os.path.join(connector, \'lib\', \'mariadb\')] libraries = [\'kernel32\', \'advapi32\', \'wsock32\', \'shlwapi\', \'Ws2_32\', client ] include_dirs = [os.path.join(connector, \'include\', \'mariadb\')] else: library_dirs = [os.path.join(connector, r\'lib\vs%d\' % vcversion), os.path.join(connector, "lib")] libraries = [\'kernel32\', \'advapi32\', \'wsock32\', client ] include_dirs = [os.path.join(connector, r\'include\')] .......................
继续查看get_metadata_and_options()方法:
def get_metadata_and_options(): config = SafeConfigParser() config.read([\'metadata.cfg\', \'site.cfg\']) metadata = dict(config.items(\'metadata\')) options = dict(config.items(\'options\')) metadata[\'py_modules\'] = list(filter(None, metadata[\'py_modules\'].split(\'\n\'))) metadata[\'classifiers\'] = list(filter(None, metadata[\'classifiers\'].split(\'\n\'))) return metadata, options
可见,这个connecter来自\'metadata.cfg\', \'site.cfg\'两个文件,查看这两个配置文件,果然在site.cfg看到了connecter配置:
connector = C:\Program Files (x86)\MySQL\MySQL Connector C 6.0.2
这里默认配置的是x86的,这就是为什么开始建议安装x86版本。
但是,即使安装的是x86,编译还是报错的,原因在于 setup.py文件中 client 变量,默认为"mariadbclient",指定的路径是include/mariadb。
对mariadb和mysql的区别没有太多概念,所以在这里采用暴力的处理方式,将client定义直接改为mysqlclient。
再次执行安装,完美~
另外,在查资料的时候发现一个安装包:https://pypi.org/project/MySQL-python/1.2.5/#files,本来想偷懒下载后直接安装的,但安装包运行时的安装路径是自动检索的,如果是用虚拟环境的,估计是需要通过添加环境变量,否则识别不到。