mac 10.14 源代码编译Python的总结

前言

目的

mac 上安装了多个Python版本,其中 的版本无法使用,表现形式为: 和 模块时报错。

背景

操作系统:mac 10.14

openssl

通过 brew 安装在 并且在 做了它的软连接。

通过 可以查看到相关文件。

其他解决方法

pyenv

据说这是一个多版本python的管理工具,但是鉴于小师弟之前出现的问题,所以我不想承担这个风险,放弃。

给现有的python3.6.5 补充 ssl 功能

遍寻无果,也许是不能补充吧,所有的方案都是重新编译。

通过 brew 安装指定版本

我的电脑已经安装了 brew,并且通过brew安装了 的版本。

据说可以, 类似这样的命令来实现安装指定版本,最终我并没有找到可用的方法。

源代码编译 Python 3.6.5

最终选择该方法“解决问题”。

优点

源代码编译安装,更容易掌控细节。

缺点

麻烦

下载源文件

在 Python.org 上下载 的源文件(.tgz),解压缩到目标文件夹。

执行编译

./configure --prefix=/usr/local/Cellar/python/3.6.5 \ --with-ssl=/usr/local/opt/opensslmakemake install

注:Cellar 目录似乎是 brew 安装的默认路径(在 下做了很多软连接到这里)

报错1:zlib 不可用

zlib 是一个扩展,装一下吧 ,安装成功。

给 补充参数 ,结果还是报错,中间尝试了各种方法。

比较多人说需要,我相信有很多人用这个语法解决了问题,但我不行(因为我已经安装过这个了)

最后一个老外给出了我要的答案,在 版本的操作系统中,需要先执行一个命令:

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

命令需要执行一会儿,大概就是安装一个headers 的包吧,并未深究。安装后解决了 的问题。

注意:并不需要 这个参数,系统会自动匹配的(这个选项这是我臆想出来的)

编译成功

没有报任何错误,但是我执行刚刚创建的 后, 依然提示找不到模块,说明编译通过但是 ssl 的问题并未解决。

解决openssl 的问题

我使用的方法,需要修改源文件,进入解压缩后的 文件夹,找到如下文件一一进行修改。

修改 setup.py

将文件中所有出现 的路径,改为 。(应该有两处)

注意:这个路径是我的 安装路径,根据电脑不同可能有所变化。

修改 modules/setup.dist

搜索 ,可以找到如下这4行代码(下面是我修改完毕的样子)

取消注释

将他们前面的号删除掉

修改路径

SSL=你的openssl 安装路径

SSL=/usr/local/Cellar/openssl/1.0.2p_ssl _ssl.c \ -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \ -L$(SSL)/lib -lssl -lcrypto

重新编译

最终使用的编译命令

./configure --prefix=/usr/local/Cellar/python/3.6.5makemake install

顺利的话,编译可以通过。如果出现 找不到 这样的错误,说明你之前的路径改的不彻底。

测试效果

执行 ,进入交互式界面输入,回车后没有报错算成功,如果提示模块不存在,那么问题依然没有解决。

我通过了!

做软连接

去 下面,删除(或备份)、、、。

然后用软连接,将这4个文件名,分别指向到 下的对应文件名。

软连接语法:

pipenv

去项目 中 删除当前环境,重建版本,通过。

进入虚拟环境后,通过 可以下载和安装扩展,说明ssl的问题算彻底解决了。

总结

这次主要出了两个问题:

zlib

原因是操作系统的版本问题

openssl

原因是 openssl 路径问题

我下载的 python 源码包,应该是给用的,因为openssl默认路径不对,但是我很奇怪:难道不应该有一个参数来指定 的路径吗?是我没找到,还是真的没有?

或者

我应该下载他们提供的 mac 版本,这里:python download for macOS,但是我担心它会主动修改环境变量、软连接等,影响我的其他版本,所以没有尝试。

遗憾

有问题的 3.6.5 版本依然在系统里,我没有删除它(不确定如何彻底删除)

不确定日后是否还有其他遗留问题。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181123B0YRIV00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券