Linux入门攻坚——13、实战软件安装-搭建Python3.8环境-1

到现在,应该可以进行软件安装的实践了。

前面学习Python时,就像搭建一个Linux的服务器环境,一直没有成功,现在尝试在CentOS6.10上搭建Python3.8环境。

安装软件前,需要的前置条件
其一就是网络是连通的,Linux上安装软件,大都需要从网络上安装,这就要求网络畅通,前面的网络属性配置就是做这个准备的。

网络配置,主要涉及本机的IP地址配置,默认网关设置,dns服务器配置。

我的机器使用的是虚拟机,虚拟机的网络配置中用的是:NAT模式(N):用于共享主机的IP地址

虚拟网络编辑器配置:

NAT设置...

DNS设置...

DHCP设置

在安装的Linux上,网卡配置为dhcp获取地址。以CentOS6.10为例

在安装完CentOS6.10后,我只改动了/etc/sysconfig/network-scripts/ifcfg-eth0中ONBOOT=yes,默认是no,然后网络就通了。

也就是在虚拟机中,选了NAT模式,并且其IP获取方式为dhcp,则先由dhcp服务器(IP为254)分配IP,然后其NAT设置中的网关IP,以及DNS设置,会覆盖虚拟机中的相关设置。

关于DNS,这里显示是192.168.138.2,是网关的IP,也就是NAT设备,在使用DNS时,192.168.138.2会再使用其配置的DNS服务器,就是上图中配置的DNS服务器。

有时不知什么原因,IP地址有了(dhcp分配IP成功),就是联不通互联网,一般是默认路由和DNS没有加载成功,这时手工添加默认路由和DNS服务器就行了。

安装软件需要的前置条件
其二就是yum源指定要正确,就是/etc/yum.repo.d/CentOS-Base.repo配置要正确。

系统默认安装的yum源,对于CentOS6.x,一定要修改,不能使用mirrorlist。系统默认的配置:
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
$releasever是主版本号,如6或7,$basearch是基础架构,一般是x86_64(或i386),$infra一般是stock,所以,变量替换后就是:
mirrorlist=http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock,结果如下

如果改成release=6,则结果反馈为:Invalid release/repo/arch combination,查看一个6版本的readme:

说明CentOS 6已经死亡,即不支持了。这时要自己找还提供源的地址,如腾讯的源:

修改repo文件,将mirrorlist改为baseurl=https://mirrors.tencent.com/centos/6.10/os/x86_64/,自己使用,gpgcheck可以设为0,其他的源也是可以修改的,如updates和extras

当然,也可以设置使用光盘作为源,系统默认使用CentOS-Media.repo作为本地光盘的yum源配置,

使用前,需要挂载光盘,否则运行yum会出错.
挂载光盘如:mount /dev/cdrom  /media/CentOS,注意挂载点要是上面三个中的一个

克隆机器的网卡修改,启动克隆的系统,查看网络

发现网卡名变成了eth1

先修改主机名称:hostname study610-f2
修改/etc/sysconfig/network,永久改变主机名

看一下网卡配置文件,以及网络接口识别命名的udev规则配置文件

在/etc/sysconfig/network-scripts/目录下,存在ifcfg-eth0配置文件,其配置是DEVICE为eth0,MAC地址是00:0C:29:06:F1:18,这些都是克隆时拷贝自原系统的设置,再看/etc/udev/rules.d/下,网络接口命名规则是根据70-persistent-net.rules来的,其内有两条,第一条是克隆自原系统的,第二条是内核识别的新系统的设备,所以修改这个配置,删掉第一条,修改第二条的NAME为eth0,再修改ifcfg-eth0配置:


重新启动系统。

一、外围支撑软件的安装
打算使用源码编译安装方式安装Python3.8,需要编译器等软件,安装Development tools软件包组和 Server Platform Development软件包组。

还需要其他一些依赖包:zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel  libffi-devel 

部分包没有安装

yum groupinstall "Development tools"
yum groupinstall "Server Planform Development"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel  libffi-devel 

以上步骤,依赖包和编译需要的工具安装完毕。

二、解决完依赖包问题,就可以安装Python3.8了,看起来很简单,下载源码,然后执行configure、make、make install三步就可以了。

实际安装,会遇到很多问题:
其一是openssl,默认系统安装的是open1.0.1e版本,好像是Python3.8版本需要更高版本的openssl;
其二是sqlite3问题,系统默认已经安装了3.6.20,但是测试安装django后,新增app时提示错误找不到sqlite3模块;
其三是Python多版本问题,系统已经安装了Python2.6.6

查看openssl默认安装情况:

可以看到,按装的位置主要有这几类:
/usr/bin :openssl是二进制可执行程序,即主程序
/etc/pki:相关的配置文件
/usr/lib64:链接库文件

/usr/lib64/openssl/engines:各种安全算法引擎库文件
/usr/share/doc:各种文档文件
/usr/share/man:man手册文件,又分为man1、man5和man7子目录
安装了openssl-devel,还包括了include头文件目录:

查看sqlite安装情况:

查看python安装情况:

三、安装Python3.8

下载源码:Python-3.8.18.tar.xz

执行:tar -xvf Python-3.8.18.tar.xz,会在当前目录下生成Python3.8.18目录

执行:./configure,生成Makefile文件

查看Makefile文件(其中部分):

# Install prefix for architecture-independent files
prefix=		/usr/local

# Install prefix for architecture-dependent files
exec_prefix=	${prefix}

# Install prefix for data files
datarootdir=    ${prefix}/share

# Expanded directories
BINDIR=		${exec_prefix}/bin
LIBDIR=		${exec_prefix}/lib
MANDIR=		${datarootdir}/man
INCLUDEDIR=	${prefix}/include
CONFINCLUDEDIR=	$(exec_prefix)/include
SCRIPTDIR=	$(prefix)/lib
ABIFLAGS=	

# Detailed destination directories
BINLIBDEST=	$(LIBDIR)/python$(VERSION)
LIBDEST=	$(SCRIPTDIR)/python$(VERSION)
INCLUDEPY=	$(INCLUDEDIR)/python$(LDVERSION)
CONFINCLUDEPY=	$(CONFINCLUDEDIR)/python$(LDVERSION)

# Symbols used for using shared libraries
SHLIB_SUFFIX=	.so
EXT_SUFFIX=	.cpython-38-x86_64-linux-gnu.so
LDSHARED=	$(CC) -shared $(PY_LDFLAGS)
BLDSHARED=	$(CC) -shared $(PY_CORE_LDFLAGS)
LDCXXSHARED=	$(CXX) -shared
DESTSHARED=	$(BINLIBDEST)/lib-dynload



# OpenSSL options for setup.py so sysconfig can pick up AC_SUBST() vars.
OPENSSL_INCLUDES= 
OPENSSL_LIBS=-lssl -lcrypto  
OPENSSL_LDFLAGS= 

默认安装路径是/usr/local,也就是prefix=/usr/local

执行:make test,发现

这个版本的python需要openssl1.0.2或1.1

不去管这些,直接make install,在/usr/local下的相关子目录下生成相应文件

bin目录下保存了可执行程序,执行python3

可见Python3.8是安装成功的,执行pip3 list

pip3执行就不成功,ssl模块有问题,这就是上面说的openssl版本不对造成的。

四、安装openssl高版本
这里安装openssl1.1.1w,下载openssl-1.1.1w.tar.gz

执行:tar -xzvf openssl-1.1.1w.tar.gz

执行./config,openssl使用的是config,而不是configure,但效果是一样的,不带任何选项,默认还是安装到/usr/local

其后生成的Makefile中,有如下内容:

安装的最高层目录是/usr/local,OPENSSLDIR是/usr/local/ssl,即配置文件目录,库文件目录是libdir,即是/usr/local/lib64,引擎目录是/usr/local/lib64/engines-1.1

直接执行,make和make install
查看安装位置:

因为新版本的安装位置变了,所以现在与老版本形成共存的状态,而Python安装使用openssl,是安装原来的位置去找openssl,所以需要将原来的版本替换掉:
备份老版本:
可执行程序(二进制程序):

头文件目录:

将新版本链接到老版本的位置,实现替换,即升级老版本。

升级链接库文件:

最后一条写错了,是libcrypto.so

将新的库文件的路径写入/etc/ld.so.conf,然后ldconfig -v使其生效
在/etc/ld.so.conf.d/下新建openssl1.1.conf,将/usr/local/lib64写入其中

然后重新编译安装python3.8,然后pip3就可用了

五、重新安装openssl1.1.1
恢复虚拟机快照至第二步,重新安装openssl1.1.1,这次安装加上选项,安装到不同位置,通过上面的安装过程,可以看到,Python和openssl都安装到了/usr/local/bin下,很混乱。

再看Makefile:

此时的安装位置为/usr/local/openssl1.1,配置文件在/usr/local/openssl1.1/ssl下,库文件路径是/usr/local/openssl1.1/lib

执行make && make install

完成后:

对老版本进行替换:

配置库文件路径写入/etc/ld.so.conf,然后ldconfig -v使其生效

再次安装python3.8

测试:

测试Django:

创建项目没有问题,创建应用时,提示找不到模块“_sqlite3”

六、重新安装Python3.8,安装到独立的目录下
系统重回到刚安装完openssl1.1.1w的状态,完成openssl升级。

#!/bin/bash
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak
ln -s /usr/local/openssl1.1/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl1.1/include/openssl/ /usr/include/openssl
mv /usr/lib64/libssl.so /usr/lib64/libssl.so.bak
mv /usr/lib64/libcrypto.so /usr/lib64/libcrypto.so.bak
ln -s /usr/local/openssl1.1/lib/libssl.so.1.1  /usr/lib64/libssl.so
ln -s /usr/local/openssl1.1/lib/libcrypto.so.1.1  /usr/lib64/libcrypto.so
cd /etc/ld.so.conf.d/
touch openssl1.1.conf
echo "/usr/local/openssl1.1/lib" > openssl1.1.conf 
ldconfig -v

python3.8安装:./configure --prefix=/usr/local/python3.8  && make && make install

这次安装Python3.8单独安装在自己独立的路径下,避免与其他程序包混交在一块。
问题是需要添加运行路径,其不在PATH环境变量中,不能直接运行python3

七、重新安装Python3.8,安装到独立的目录下,同时不升级openssl(个人推荐)

系统重回到刚安装完openssl1.1.1w的状态,不升级(这里说的不升级,是不对老版本的文件进行替换,即不执行前面脚本的mv和ln命令行),只添加和加载动态链接库:

cd /etc/ld.so.conf.d/
touch openssl1.1.conf
echo "/usr/local/openssl1.1/lib" > openssl1.1.conf 
ldconfig -v

python3.8安装:./configure --prefix=/usr/local/python3.8  --with-openssl=/usr/local/openssl1.1 && make && make install

configure的--with-openssl参数指定安装的高版本openssl的位置,就可以直接使用这个版本的openssl,而不会去找默认的openssl安装位置。

可以看到这种安装方法也能成功安装python和pip,不需要对openssl做过多的操作。
现在问题主要是Python和pip的路径问题,不能直接运行python3和pip3,因为PATH中没有对应的路径。

将python3和pip3的路径加到PATH中:
编辑~/.bashrc,增加一行:export PATH=/usr/local/python3.8/bin:$PATH
保存后,执行source ./.bashrc

现在python3和pip3运行的问题视乎解决了,但是考虑一下,还是有问题的:
只能以python3和pip3来运行新版本,运行python和pip,还是运行python2的版本,解决的方法是在python3安装目录的bin目录下,创建链接:
ln -s /usr/local/python3.8/bin/python3 /usr/local/python3.8/bin/python
ln -s /usr/local/python3.8/bin/pip3 /usr/local/python3.8/bin/pip

重启启动系统,再运行python,就是python3了。
但问题是,系统中有些软件使用的python2版本,其脚本如果直接写的python,就会变成使用python3,有可能造成版本不匹配的问题。

不管怎样,我个人认为这种方法算是最好的了,其他的脚本中可能写的是#!/usr/bin/python,写了全路径,就会调用老版本。

每个版本中都创建python和pip软链接,想使用哪个版本,将哪个版本的路径加到PATH的最开始,使用其他版本时,可以直接使用pythonx.x,也可以使用绝对路径/usr/local/pythonx.x/bin/python

用了将近一个周的时间捣鼓这个软件安装,感觉这个Linux使用真的是很麻烦很难。

下一步就是解决sqlite3的问题了。

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值