【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

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa