【046】Python全栈日记-Linux(四)

2023-10-29 02:40
文章标签 python linux 全栈 日记 046

本文主要是介绍【046】Python全栈日记-Linux(四),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

本次为linux最后一次日记,下一阶段将要进行django的学习,也是python最重要的一个部分,django将要串通我之前学习的所有内容,本次在结尾也会做一个小的引入。

 

今天使用root用户进行编程,这样就不会提示权限不够了,切换方法

sudo su root,然后输入密码

如果忘记密码可以使用sudo passwd root来修改密码

 

一、Shell编程理论和运用

1、程序的编程风格和执行模式

过程式:以指令为中心,来进行写程序,数据服务于指令。(bash shell)   C  

对象式:以数据为中心,考虑先如何组织数据,指令服务于数据。  C#     C++   JAVA   PYTHON ……

 

2、shell程序(调用二进制程序,解释执行)

程序的执行方式

计算机:二进制指令

计算机是无法识别我们敲的代码的,需要变为二进制指令计算机才能使用。

而shell就是一个解释我们所写代码变为二级制代码给计算机执行的程序

   

3、编程语言:

低级:汇编语言

高级:

编译:高级语言-->编译器-->目标代码    c    java

解释:高级语言-->解释器-->机器代码    shell   php   ruby   python

解释语言的效率会低于编译,编译就相当于对整本书进行翻译,而解释就相当于同声翻译。

 

4、shell编程的执行模式(和python一致)

顺序执行

循环执行

选择执行

 

5、shell编程的结构   

我们常的shell为bash shell

bash shell核心中心就是调用指令(堆命令,严重依赖当前环境)

写一个简单的shell脚本理解一下何为堆命令,用vim编写一个脚本名为:text.sh。

保存退出,然后通过sh text.sh执行

这样一个简单的脚本就完成了。

 

严重依赖环境的意思就是,你写的脚本为数据库管理,如果你的linux没有建数据库,脚本就失效了。

 

 

6、脚本应用场景和格式

(1)应用场景

重复、批量事务处理、自动化运维、定期任务执行、服务器运行监控

(2)格式

shell脚本:是一个文本文件,约定俗成要以.sh为结尾

脚本结构:脚本声明+注释(解释信息)+可执行语句

#!/bin/bash:脚本声明

编写人(选写)

编写日期(选写)

脚本声明的意思就是,我要使用bash来解释本脚本

如果是python的脚本,就要使用#!usr/bin/python3来声明

 

 

7、脚本的概念

将要执行的命令按照顺序保存到一个文本中

给文件相应的权限即可执行

chmod  a=x  /xxxx.sh

结合控制语句可以完成复杂操作

 

 

8、Shell程序的执行和Python程序的执行

(1)Shell程序的执行

【1】当前路径  ./  

【2】绝对路径  /    (所有解释型语言通用,以上两种需要有执行权)

修改权限:

编写脚本内容vim text.sh

echo就是print()

执行文件:

【3】命令bash、sh :不需要执行权

sh是使用默认shell执行脚本

bash是使用bash shell执行脚本

 

(2)执行python文件

先创建python文件,直接vim一个不存在的文件就是新建并编辑。

执行:

 

(3)bash的单步执行:

bash -x /path/to/script :相当于dubug,检查每一步如何运行    

bash -n  /path/to/script     检查语法是否错误

没有错误不会有返回。

 

 

二、变量的概念和运用

1、变量:是一段内存空间

变量不用声明,直接赋值即可

在shell中使用变量一定要加上$,例如$a、$i

 

2、Shell引用

(1)‘ ’:强引用,变量替换不会进行

(2)“ ”:弱引用,能够执行变量替换,就是正常使用变量

(3)``:命令替换,引用命令的执行结果,另外一种方式$(),反引号在1键的左边。

第一个ls我们查看有什么文件。

第二个`ls`是执行ls的结果也就是执行fstab,因为不存在这个命令,所以显示未找到。

第三个是打印`ls`代表什么,也就是打印ls命令后的结果,就是fstab

 

(4)变量替换:${变量名}

通常情况下大括号可以省略  如果变量名后面要跟如下内容:非小写字符串(包括大小字符串)、数字或下划线,那么变量名就一定要用大括号包起来 

例如我们存一部分dns

这样非常明显能看出来是10.10.16.101,如果不用大括号框住dns就很不美观。

 

3、echo

和其他编程语言一样echo 代表打印print

 

4、shell中的变量赋值   

变量名=值(中间不要间隔空格)

注意:变量在赋值时不能在前面带$

 

变量名只能包含字母、数字和下划线,并且不能以数字开头

变量名区分大小写

尽量能见名知义

 

5、定义变量

(1)本地变量:只对当前shell进程有效,对其子shell以及其他shell都无效

定义变量:Var_Name="Value"

引用变量:${Var_Name}通常情况下大括号可以省略

撤销变量:unset Var_Name

 

(2)局部变量:只对某一部分有效

定义变量:local Var_Name="Value"

 

(3)环境变量:对其shell进程及其子shell有效

系统内置的环境变量可以env命令查看

 

 

6、位置变量  (shell特殊的变量)

$1,......$n   (需要传递参数)

直接写在脚本里,然后使用脚本的时候写入参数,例如

 

脚本内容:对传入的文件显示其中空行(^$:正则表达式)

结果:bash test.sh /etc/passwd /etc/fstab

 

 

7、特殊变量:

(1)$0:脚本名称自身

(2)$#所有参数的总和数

(3)$*所有参数列举出来

执行脚本:

 

 

(4)程序执行状态返回值

$?:上一条命令的执行状态,

状态用数字表示:0-255

0:表示成功

1-255:失败,1.2.127.255预留

当执行命令成功,正确、true就会返回0

错误就会返回非0的数。

 

 

 

 

三、变量运算

在bash shell中,不支持浮点型,不支持字符算术运算。

因为shell会把算术当作命令执行。

 

1、运算符

(1)操作符:+,—,*,/,%(余数)

(2)复合赋值符

【1】+=,-=,*=,/=,%=

a+=b 等于a=a+b,剩下同理

【2】id++,id—

Id++等于Id = id + 1

Id—等于Id = id - 1

 

2、可以通过以下方式进行运算:

(1)let:

let varName=算术表达式

echo打印的时候变量一定要加$

(2)varName=$[算术表达式]

以下为骨灰级程序员才会使用,效率较低

(3)varName=$((算术表达式))

(4)varName=`expr 变量1 + 变量2 `

 

3、除法运算有余数被省略(圆整)

即使是0.99也是0

 

 

注意:如果在函数中用let写运算,用sh执行时显示let no found的

或者在函数中使用$[1+2]做计算,用sh执行显示1+2字符串的

造成这个问题的原因是ubantu默认使用的shell为dash,dash只有bash一部分的功能。

两种方法解决:

1、不使用sh执行脚本sh是使用默认shell,使用bash或者./

2、修改默认shell

Sudo dpkg-reconfigure dash

选择No,使用bash作为默认shell

 

 

 

四、脚本循环控制语句

for  while  until

 

1、先学习一个类似python中range的东西

Seq遍历元素

语法:seq 起点 步长 终点

当我们使用的时候seq的时候因该加上反引号,因为我们需要的是seq的结果。

 

2、for循环

例如写一个脚本,创建10个文档,名字为text1-text10

执行bash mingming.sh、结果:

 

 

bash -n 脚本文件 检查脚本文件语法是否错误

 

练习:

(1)创建10个用户,并显示其uid

结果

 

(2)1加到100的和数

 

 

3、输入命令(变量的赋值以交互式来进行)

read -p 交互文字 变量

就是python中的input,输入命令

 

 

五、条件判断

1、测试方法:

(1)test 条件表达式

(2)[ 条件表达式 ] 或者  [[ 条件表达式 ]](注意两边至少有一个空格)

文件或目录测试   格式   [ 操作符  文件或目录 ]

 

-d:测试是否为目录

-f:测试是否为文件

-e:测试文件是否存在

-r:测试文件是否有读权

Test例子:

条件表达式

 

 

2、数值比较测试  

格式 :[ 数值1  操作符  数值2 ]

操作符

-eq : 等于

-gt : 大于

-ge : 大于等于

-lt : 小于

-le : 小于等于

              

 

 

3、逻辑测试

布尔值(真:0  假)

(1)与运算:&&

真 && 真 = 真(0)

真 && 假 = 假

假 && 真 = 假

假 && 假 = 假

如果第一个为假就不往后看了,输出假

 

(2)或运算:

真 || 真 = 真(0)

真 || 假 = 真

假 || 真 = 真

假 || 假 = 假

如果第一个为真,就不往后看了,输出为真

 

(3)非运算:

!真 = 假

!假 = 真

 

练习题,统计用户数(etc/passwd),如果大于30个用户,输出总共多少用户。

一定要在给指令加上反引号``,因为我们给sum赋值的是指令的结果,而不是把指令赋值给sum

 

 

 

 

4、if语句判断(单分支  双分支  多分支)

(1)If单分支格式

例子:字符串可以用==表示的等于,但是数字比值只能使用-eq表示等于。

(2)if双分支结构  

例子:

(3)if多分支结构

例子1:输入名字判断是谁

例子2:成绩分类60以下不及格,60-80及格,80-99满意,100满分

例子3:成绩分类折半优化60以下不及格,60-80及格,80-99满意,100满分

 

 

 

 

5、case语句

格式  :

例子1:名字判断

例子2.成绩分类,由于case的条件不能添加多个条件选择所以使用[0-9][0-9]的方法来拼凑数字。

 

 

 

6、Wille循环 

格式

while循环:条件测试成功,则循环;失败,则退出

 

必须有时刻条件测试不成功,要不就会造成死循环,在linux下死循环很致命。所以需要在循环体中改变测试条件中用于控制循环次数的变量的值。

 

例1:1到100之和,数学运算时一定要加上let,一定别忘步长

 

 

例2:用while循环写一个脚本

Ping 10.10.16这个网段的主机,打印出可以ping通的和不能ping通主机的数量,要求10.10.16.50-10.10.16.100这个区间

结果为:

ping通主机的数量

不能ping通主机的数量

(这个题看看方法就行,因为我们在一个局域网中,10.10.16这个网段有我们很多的机器,自己练习应该是一个都无法ping通的)

 

 

例3:100以内素数

 

例4.斐波那契数列

 

7、until循环  (条件测试不成功则循环)

条件不满足循环,直到满足就退出循环,和while是反的

 

 

六、shell函数

和python基本一致,甚至更简单,连def都不用加了。

 

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

代码重用可以用函数代替

 

1、shell函数格式 (老师上课一笔带过,我这摘自菜鸟联盟)

说明:

(1)可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。

(2)参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

 

事例:

结果:

 

 

2、下面定义一个带有return语句的函数:

脚本内容:

结果:

函数返回值在调用该函数后通过 $? 来获得。

 

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

 

 

3、函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...

 

带参数的函数示例:

结果:

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

 

 

 

 

七、web网站架构和Nginx(概述)

1、网站架构原理

客户端通过http协议(tcp)连接httpd服务器,python使用的httpd服务器为nginx,nginx处理静态资源没有问题,但是处理动态资源(.py)非常差,所以需要wsgi来实现动态资源。

 

2、LNMP(基于python的web架构)

LNMP=Linux+nginx+mysql+python

静态资源:客户端从服务器获得的资源表现形式与原文件相同(前端内容为静态)

动态资源:通常是程序文件,需要服务器执行后,将执行结果返回给客户端。

注意:httpd服务器是纯静态的web服务器。

这里就和当初前端的静态动态不同了,前端中html+css为静态,js为动态。

 

3、主流httpd服务器:Apache   Nginx

 

4、WSGI:Web服务器网关接口(Python Web Server Gateway Interface)

(1)Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。WSGI是作为Web服务器与Web应用程序或应用框架之间的一种低级别的接口,以提升可移植Web应用开发的共同点。WSGI是基于现存的CGI标准而设计的。

 

(2)uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

 

(3)要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

WSGI是一种通信协议。

uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。

而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

 

 

 

5、Nginx介绍

是一款开源的轻量级的高性能的静态资源web服务器、同时也是非常优秀反向代理服务器、缓存服务器、邮件代理服务器。

最早由俄罗斯程序员伊戈尔·赛索耶夫开发,官方主页http://nginx.org

理念和apache不一样,占用内存少、并发能力强、在中国大陆绝大部分的网站服务器都在使用。

属于web服务器解决方案领域的新贵,市场份额一路飙升。

 

(1)安装方法:

【1】源码:编译安装

【2】官方的rpm包:在linux下输入命令

sudo apt-get -y install nginx

 

安装后就会生成配置文件目录

配置文件目录:/etc/nginx

主配置文件:  /etc/nginx/nginx.conf

uwsgi参数配置文件:/etc/nginx/uwsgi_params

被主配置文件包含的配置文件:/etc/nginx/sites-available/default

网页根路径:/var/www/html

 

 

(2)使用nginx

【1】开启nginx

sudo nginx

【2】查询自己的ip

Ip a

在自己家一般是192开头的,然后在浏览器输入ip

【3】修改网页静态资源

在/var/www/html下有个index.nginx-debian.html

这就是刚才那个网页的html文件,删除这个文件,把在前端阶段做的京东页面整个挪进来。

再次在浏览器中输入ip并加上/京东,因为京东是个文件夹,如果是把文件夹中内容直接放在html目录下,就不用加/京东

当然我们还可以修改ip,通过我们指定的ip进入我们做的网页。

 

这是使用nginx实现静态资源,那像python写的动态文件能否实现呢?在html目录下写一个py文件,内容为print(“hello world”)。

在chorme浏览器中输入ip/py.py,你会发现,py文件被下载,而不是执行(不同浏览器表现不同,但是都不会执行),这就是最开始提到的,nginx处理动态资源(.py)非常差。这时候就需要wsgi来协助了。

 

 

 

6、wsgi的web实现(通过linux服务器实现网页页面)

(1)进入临时文件目录下,方便后来修改

cd /tmp

(2)安装所需环境

sudo apt-get -y install build-essential python3-dev python3-pip python-pip curl

如果出现依赖问题,请使用sudo apt-get autoremove 文件名 删除依赖文件

 

(3)安装uwsgi

对python来说,uWSGI的安装方式很多:

【1】通过pip

pip3 install uwsgi

【2】通过网络安装

sudo curl http://uwsgi.it/install | bash -s default /tmp/uwsgi

这种方式会在/tmp/uwsgi路径下安装二进制版本,并且可以随意改变它。

 

推荐两个都执行一次,避免出问题

 

(4)创建目录,创建py文件

sudo mkdir /myweb

cd /myweb

sudo vim test.py

 

py文件内容为:

def application(env,start_response):

    body = 'hello ujiuye.'

    status = '200 OK'

    headers = [('content-type', 'text/html'), ('content-length',str(len(body))) ]

    start_response(status,headers)

return [body.encode()]

 

(5)启动wsgi

默认情况下uWSGI只会开启一个进程和一个线程。

你可以用--processes选项和--threads选项添加更多的进程和线程。

 

sudo uwsgi --http :9090 --wsgi-file /myweb/test.py --master --processes 4 --threads 2

 

以上命令将会产生一个主进程,4个工作进程,和http路由。主进程会控制4个工作进程结束时再重新生成新的进程。每个工作进程下有2个线程。端口为9090。执行完别关闭。结束进程可使用ctrl+c

开启uwsgi后,在浏览器中输入ip:9090,因为我们设置了9090端口,就能实现py文件的内容:

 

 

7、Nginx反向代理uwsgi,实现静态页面和动态页面的分离

就是直接使用ip+py文件执行,而不需要端口。

Nginx实现反向代理,需要基于proxy模块,语法如下

 

(1)实现这个功能,需要修改nginx的、被主配置文件包含的配置文件:

/etc/nginx/sites-available/default

 

通过vim打开/etc/nginx/sites-available/default配置文件,然后在图中位置处:

(2)添加下图代码:

添加后如图:

保存退出

 

(3)检查语法是否有误:sudo nginx -t

(4)重启nginx服务:sudo service nginx restart

 

(5)最后启动wsgi

sudo uwsgi --http :9090 --wsgi-file /myweb/test.py --master --processes 4 --threads 2

 

在浏览器中输入ip/text.py

这样就实现静态页面和动态页面的分离nginx实现静态,wsgi实现动态。

 

 

 

 

 

 

 

 

 

这篇关于【046】Python全栈日记-Linux(四)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念