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

2024-01-20 21:04

本文主要是介绍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的问题了。

这篇关于Linux入门攻坚——13、实战软件安装-搭建Python3.8环境-1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/627330

相关文章

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

mac安装redis全过程

《mac安装redis全过程》文章内容主要介绍了如何从官网下载指定版本的Redis,以及如何在自定义目录下安装和启动Redis,还提到了如何修改Redis的密码和配置文件,以及使用RedisInsig... 目录MAC安装Redis安装启动redis 配置redis 常用命令总结mac安装redis官网下

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Mycat搭建分库分表方式

《Mycat搭建分库分表方式》文章介绍了如何使用分库分表架构来解决单表数据量过大带来的性能和存储容量限制的问题,通过在一对主从复制节点上配置数据源,并使用分片算法将数据分配到不同的数据库表中,可以有效... 目录分库分表解决的问题分库分表架构添加数据验证结果 总结分库分表解决的问题单表数据量过大带来的性能

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一