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的问题了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/338817.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云边协同的 RTC 如何助力即构全球实时互动业务实践

作者:即构科技 由 51 CTO 主办的“WOT 全球技术创新大会 2023深圳站”于 11 月 24 日 - 25 日召开,即构科技后台技术总监肖潇以“边缘容器在全球音视频场景的探索与实践”为主题进行分享。 边缘计算作为中心云计算的补充,通过边缘容器架构和…

配置DNS主从服务器,实现真反向解析

主服务器 [rootbogon ~]# systemctl stop firewalld.service #关闭防火墙 [rootbogon ~]# setenforce 0 #关闭selinux [rootbogon ~]# systemctl restart named #启动dns服务 [rootbogon ~]# vim /etc/named.conf #进入dns配置文件 options {#监听…

进程内协同:原子操作、互斥、同步和通信的原理

进程内协同,简单来说,就是在一个进程内部,多个执行体(如线程、协程)如何共享资源,如何协同工作以完成一项任务。这涉及到一系列的机制和技术,包括原子操作、互斥、同步和通信等。 那么&#xf…

微前端-无界wujie

无界微前端方案基于 webcomponent 容器 iframe 沙箱,能够完善的解决适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户的核心诉求。 主项目安装无界 vue2项目:npm i wujie-vue2 -S vue3项目…

Qt5.15.2中加入图片资源

系列文章目录 文章目录 系列文章目录前言一、加入图片资源二、代码 前言 以前用的Qt5.15.2之前的版本,QtCreator默认的工程文件是*.pro,现在用5.15.2创建工程默认的工程文件是CMameList.txt,当然在创建项目时,仍然可以使用pro工程文件用QtCr…

C#,入门教程(24)——类索引器(this)的基础知识

上一篇: C#,入门教程(23)——数据类型转换的一点基础知识https://blog.csdn.net/beijinghorn/article/details/124187182 工业软件首先要求高可靠性、高可维护性。 作为工业软件的开发者,我们对语言重载的需求是:“不可或缺”。 …

第6章 SpringBoot缓存管理

学习目标 了解SpringBoot的默认缓存 熟悉SpringBoot中Redis的缓存机制及实现 掌握SpringBoot整合Redis的缓存实现 缓存是分布式系统中的重要组件,主要解决数据库数据的高并发访问问题。在实际开发中,尤其是用户访问量较大的网站,为了提高服…

12、Kafka ------ Kafka 生产者API 用法(代码演示生产者发送消息到指定主题)

目录 Kafka 生产者API 用法(代码演示)生产者API 介绍依赖:介绍:使用生产者API发送消息步骤: 生产者发送消息代码演示:1、创建一个Maven项目2、依赖3、代码4、演示结果5、一些参数理解 Kafka 生产者API 用法…

乐意购项目前端开发 #4

一、Home页面组件结构 结构拆分 创建组件 在 views/Home 目录下创建component 目录, 然后在该目录下创建5个组件: 左侧分类(HomeCategory.vue)、Banner(HomeBanner.vue)、精选商品(HomeHot.vue)、低价商品(Homecheap.vue)、最新上架(HomeNew.vue) 引用组件 修改 views/Home…

5.2 内容管理模块 - 课程发布需求分析、分布式技术方案

内容管理模块 - 课程发布 - 分布式技术方案、 课程发布需求分析 文章目录 内容管理模块 - 课程发布 - 分布式技术方案、 课程发布需求分析一、分布式事务技术方案1.1 本地事务1.2 分布式事务1.3 CAP理论1.4 分布式事务控制方案 二、课程发布2.1 需求分析2.2 数据模型2.2.1 课程…

EasyRecovery2024专业免费的数据恢复软件,支持从硬盘、光盘、U盘、移动硬盘、等所有类型的介质上恢复数据。

Ontrack EasyRecovery Home是一款企业级的数据恢复软件,支持从硬盘、光盘、U盘、移动硬盘、硬件RAID及软件RAID等所有类型的介质上恢复数据。支持恢复误删除、磁盘格式化、磁盘重新分区、磁盘逻辑坏道等原因而丢失的数据。支持RAID重建!Ontrack EasyReco…

python基础学习-01

Python 是一种简单易学并且结合了解释性、编译性、互动性和面向对象的脚本语言。Python提供了高级数据结构,它的语法和动态类型以及解释性使它成为广大开发者的首选编程语言。 Python 是解释型语言: 开发过程中没有了编译这个环节。类似于PHP和Perl语言。…

「环境配置」使用Windows自带工具清理C盘空间

​ Windows电脑操作系统一般是安装在磁盘驱动器的C盘中,一旦运行,便会产生许多垃圾文件,C盘空间在一定程度上都会越来越小。伴随着电脑工作的时间越久,C盘常常会提示显示其内存已不足。本文记录笔者清理机器的步骤。 一、使用Win…

学会这个工具,小白也可制作门窗电子画册

​随着互联网技术的发展,现在制作电子画册已经变得非常简单。如果你是一个新手,也可以通过学习一些技巧来制作门窗电子画册。 那么,如何制作门窗电子画册呢?其实,这个过程并不复杂。只需要一台电脑和一个基本的操作工具…

Flask 3.x log全域配置(包含pytest)

最近使用到flask3.x,配置了全域的log,这边记录下 首先需要创建logging的配置文件,我是放在项目根目录的, Logging 配置 logging.json {"version": 1, # 配置文件版本号"formatters": {"default&qu…

「优选算法刷题」:在排序数组中查找元素的第一个和最后个位置

一、题目 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&a…

C#调用Newtonsoft.Json将bool序列化为int

使用Newtonsoft.Json将数据对象序列化为Json字符串时,如果有布尔类型的属性值时,一般会将bool类型序列化为字符串,true值序列化为true,false值序列化为false。如下面的类型序列化后的结果如下: public class UserInfo…

LINUX文件fd(file descriptor)文件描述符

目录 1.文件接口 1.1open 1.2C语言为什么要对open进行封装 2.fd demo代码 第一个问题 第二个问题 打开文件流程 引言:在学习C语言的时候,我们见过很多的文件的接口,例如fopen,fwrite,fclose等等,但…

Linux上软件安装

软件安装常见方式 二进制发布包 软件已经针对具体平台编译打包发布,只要解压,修改配置即可。 RPM包 软件已经按照redhat的包管理工具规范RPM进行打包发布,需要获取到相应的软件RPM发布包,然后用RPM命令进行安装,但…

2024年高校建设大数据实验室建设的意义

数据挖掘与大数据分析是以计算机基础为基础,以挖掘算法为核心,紧密面向行业应用的一门综合性学科。其主要技术涉及概率论与数理统计、数据挖掘、算法与数据结构、计算机网络、并行计算等多个专业方向,因此该学科对于实验室具有较高的专业要求…
最新文章