【python零基础入门学习】python基础篇之系统模块调用shell命令执行(四)

 本站以分享各种运维经验和运维所需要的技能为主

《python》:python零基础入门学习

《shell》:shell学习

《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战

《k8》暂未更新

《docker学习》暂未更新

《ceph学习》ceph日常问题解决分享

《日志收集》ELK+各种中间件

《运维日常》持续更新中

系统管理模块:

shutil模块:

用于执行一些shell操作

import shutil
import os
f1 = open('/etc/hosts', 'rb')
f2 = open('/tmp/zj.txt', 'wb')
shutil.copyfileobj(f1 , f2)
f1.close()
f2.close()#拷贝文件,cp /etc/hosts /tmp/zhuji
shutil.copy('/etc/hosts','/tmp/yff')
shutil.copy('/etc/hosts','/tmp/yff.txt')#cp -p /etc/hosts /tmp/zhuji
shutil.copy2('/etc/hosts','/tmp/yff2')#cp -r /etc/security /tmp/anquan
shutil.copytree('/etc/security','/tmp/anquan')#mv /tmp/anquan /var/tmp/
shutil.move('/tmp/anquan','/var/tmp')#chown bob.bob /tmp/yyf
shutil.chown('/tmp/yff.txt',user='yyf',group='yyf')
shutil.chown('/tmp/yff',user='yyf',group='yyf')
shutil.chown('/tmp/yff2',user='yyf',group='yyf')#rm -rf /var/tmp/anquan ---只能删除目录
shutil.rmtree('/var/tmp/anquan')
#rm -rf /tmp/yyf ----删除文件
os.remove('/tmp/yff2')

subprocess模块:

用于调用系统命令

>>> import subprocess
>>> result = subprocess.run('id root', shell=True)
uid=0(root) gid=0(root) 组=0(root)>>> result = subprocess.run('id root ; id yyf', shell=True)
uid=0(root) gid=0(root) 组=0(root)
uid=1003(yyf) gid=1003(yyf) 组=1003(yyf)>>> result = subprocess.run('id root ; id ddd', shell=True)
uid=0(root) gid=0(root) 组=0(root)
id: ddd: no such user>>> result.args
'id root ; id ddd'>>> result.returncode -----相当于 shell 的$?
1#如果不希望把命令的执行结果打印在屏幕上,可以使用以下方式:
>>> import subprocess
>>> result = subprocess.run('id root; id sss', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> result.stderr
b'id: sss: no such user\n'
>>> result.stdout
b'uid=0(root) gid=0(root) \xe7\xbb\x84=0(root)\n'
>>> result.stdout.decode()
'uid=0(root) gid=0(root) 组=0(root)\n'
>>>py:
import subprocess
result = subprocess.run('id root ; id fff ', shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print(result.stderr)
print(result.stdout)
print(result.stdout.decode())测试结果:
b'id: fff: no such user\n'
b'uid=0(root) gid=0(root) \xe7\xbb\x84=0(root)\n'
uid=0(root) gid=0(root) 组=0(root)

ping脚本:

import sys
import subprocessdef ping(host):result = subprocess.run('ping -c2 %s &> /dev/null' % host , shell=True)if result.returncode == 0 :print('%s:up' % host)else:print('%s:down' % host)if __name__ == '__main__':ping(sys.argv[1])

编程常用语法风格以及习惯:

语法风格:

链示多重赋值:

>>> a=b=[10,20]
>>> b.append(40)
>>> a
[10, 20, 40]
>>> b
[10, 20, 40]

多元变量赋值:

>>> a,b = 10 ,20
>>> a
10
>>> b
20
>>> c, d = (10,20)
>>> c
10
>>> d
20
>>> e, f = [10, 20 ]
>>> e
10
>>> b
20
>>> a = [100]
>>> a
[100]
>>> g, f = 'ab'
>>> g
'a'
>>> f
'b'两个变量互换>>> t = a
>>> a = b
>>> b = t
>>> a
20
>>> b
[100]
>>> a , b = b ,a 
>>> a
[100]
>>> b
20

合法标识符:

>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
>>> 'pass' in keyword.kwlist
True
>>> keyword.iskeyword('is')
True

內建: 

內建不是关键字,可以被覆盖,除非你不用它

len = 100

len('abc')  -----无法使用原来的功能

模块文件布局:

```python
#!/usr/local/bin/python3         # 解释器
"""模块文件名模块文件的说明文字,即文档字符串,用于help帮助
"""
import sys                       # 模块导入
from random import randint, choicehi = 'Hello World'               # 全局变量
debug = Trueclass MyClass:                   # 类的定义passdef func1():                     # 函数定义passif __name__ == '__main__':       # 主程序代码func1()
```
#!/usr/local/bin/python3       ---解释器
"""演示模块辣鸡
"""
hi = 'hello shabichao'  # 全局变量之后才可以调用def pstar(n=30):"用于打印n个星号"print('*' * n)if __name__ == '__main__':print(hi)pstar()pstar(50)>>> import star
>>> help(star)
Help on module star:
NAMEstar - 演示模块
DESCRIPTION辣鸡
FUNCTIONSpstar(n=30)用于打印n个星号
DATAhi = 'hello shabichao'
FILE/root/nsd1907/py01/day03/star.py

判断文件是否存在:

>>> import os
>>> os.path.ex
os.path.exists(      os.path.expanduser(  os.path.expandvars(  os.path.extsep       
>>> os.path.ex
os.path.exists(      os.path.expanduser(  os.path.expandvars(  os.path.extsep       
>>> os.path.exists('/tmp/yff')
True
>>> os.path.exists('/tmp/yffdd')
False

编程思路:

1. 发呆。思考程序的动作方式(交互?非交互?)
```shell
文件名: /
文件已存在,请重试。
文件名: /etc/hosts
文件已存在,请重试。
文件名: /tmp/abc.txt
请输入文件内容,在单独的一行输入end结束。
(end to quit)> hello world!
(end to quit)> how are you?
(end to quit)> the end
(end to quit)> end
# cat /tmp/abc.txt
hello world!
how are you?
the end
```
2. 分析程序有哪些功能,把这些功能编写成函数
```python
def get_fname():'用于获取文件名'
def get_content():'用于获取内容'
def wfile(fname, content):'用于将内容content,写入文件fname'
```
3. 编写程序的主体,按一定的准则调用函数
```python
def get_fname():'用于获取文件名'
def get_content():'用于获取内容'
def wfile(fname, content):'用于将内容content,写入文件fname'
if __name__ == '__main__':fname = get_fname()content = get_content()wfile(fname, content)
```
4. 完成每一个具体的函数

 实例:

"""创建文件这是一个用于创建文件的脚本,用到的有三个函数
"""
import osdef get_fname():'用于获取文件名'while 1 :fname =  input('文件名: ')if not os.path.exists(fname):breakprint('文件已存在,请重新输入: ')return fnamedef get_content():'用于获取内容'content = []print('请输入文件内容,在单独的一行输入end结束')while 1:line = input('(end to quit)> ')if line == 'end':break#content.append(line + '\n')content.append(line)return content# print('请输入文件内容,在单独的一行输入end结束')# f = open(fname,'w')# while if q != end :# content = f.writelines([q = input('(end to quit)>: ')])def wfile(fname,content):'用于将内容content,写入文件fname'with open(fname, 'w') as fobj:fobj.writelines(content)# fobj = open(fname,'w')# fobj.writelines(content)# fobj.close()if __name__ == '__main__':fname = get_fname()content = get_content()print(content)content = ['%s\n' % line for line in content]wfile(fname, content)

 序列对象:

包括字符串 列表 元组

#list用于将某些数据转成列表  
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list('abc')
['a', 'b', 'c']
#tuple用于将某些数据转成元组
>>> tuple('abc')
('a', 'b', 'c')
>>> tuple(range(10))
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)>>> len('asdasd')
6#reversed 用于翻转
>>> alist = [ 10 , 8 , 25 , 1, 100]
>>> list(reversed(alist))
[100, 1, 25, 8, 10]
>>> for i in reversed(alist):
...     print(i)#sorted用于排序,默认升序
>>> sorted(alist)
[1, 8, 10, 25, 100]#enumerate 用于获取下标和值
>>> user = ['tom','yyf','chao']
>>> list(enumerate(user))
[(0, 'tom'), (1, 'yyf'), (2, 'chao')]
>>> for i in enumerate(user):
...     print(i)
... 
(0, 'tom')
(1, 'yyf')
(2, 'chao')
>>> for i, name in enumerate(user):
...     print(i,name)
... 
0 tom
1 yyf
2 chao
>>> print(i)   ------一次次的赋值给变量i
2

字符串:

格式化操作符:
>>> '%s is %s years old' % ('tom',20)
'tom is 20 years old'
>>> '%s is %d years old' % ('tom',20)
'tom is 20 years old'
>>> '%s is %f years old' % ('tom',20.5)
'tom is 20.500000 years old'
>>> '%s is %d years old' % ('tom',20.5)
'tom is 20 years old'
>>> '%d is %d years old' % ('tom',20) -----tom转不成数字
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: %d format: a number is required, not str
>>> '%s is %.1f years old' % ('tom',20.5) ------%.1f 指保留1位小数
'tom is 20.5 years old'>>> '%10s%8s' % ('tom',20.5)  -----正数向右对齐
'       tom    20.5'
>>> '%10s%8s' % ('tom','age')
'       tom     age'
>>> '%-10s%-8s' % ('tom','age')  ------负数向左对齐
'tom       age     '
>>> '%-10s%-8s' % ('tom',20)
'tom       20#不常用 了解
>>> '%c' % 97  ----将数字根据ascii码转成对应的字符
'a'
>>> '%c' % 65
'A'
>>> '%#o' % 10----8进制
'0o12'
>>> '%#x' % 10------16进制
'0xa'
>>> '%e' % 10000-----科学计算法----
'1.000000e+04'  ------e+04  10的4次方
>>> '%8d' % 10
'      10'
>>> '%08d' % 10  -----宽度8  不够的补0
'00000010'format函数
>>> '{} is {} years old'.format('tom',20)
'tom is 20 years old'
>>> '{1} is {0} years old'.format('tom',20)
'20 is tom years old'

 format函数:

创建用户:

"""创建用户这是一个用于创建用户的脚本,用到有4个函数
"""import sys
import randpass
import subprocessdef add_user(user, passwd, fname):#如果用户已存在,则返回,不要继续执行函数result = subprocess.run('id %s &> /dev/null' % user, shell=True)if result.returncode == 0 :print('用户已存在')#return默认返回None,类似于break,函数遇到return也会提前结束return# 创建用户, 设置密码subprocess.run('useradd %s' % user, shell=True)subprocess.run('echo %s | passwd --stdin %s' % (passwd,user),shell=True)#写入文件info = """用户信息:用户名: %s密码: %s""" % (user,passwd)with open(fname,'a') as fobj:fobj.write(info)if __name__ == '__main__':user = sys.argv[1]passwd = randpass.mk_pass2()fname = sys.argv[2]add_user(user,passwd,fname)

原始字符串操作符:

>>> win_path = 'c:\temp'
>>> print(win_path)
c:      emp
>>> wpath = r'c:\temp'
>>> print(wpath)
c:\temp
>>> win_path = 'c:\\temp'
>>> print(win_path)
c:\temp
>>> a = r'c:\tem\tec'
>>> print(a)
c:\tem\tec

格式化输出:

>>> '+%s+' % ('*' * 50)
'+**************************************************+'
>>> 'hello world'.center(48)
'                  hello world                   '
>>> '+hello world+'.center(50)
'                  +hello world+                   '
>>> '+%19s%-18s+' % ('hello','world')
'+              helloworld             +'>>> 'hello world'.center(48,'*')
'******************hello world*******************'
>>>
>>> 'hello world'.ljust(48,'a')
'hello worldaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
>>> 'hello world'.ljust(48,'#')
'hello world#####################################'
>>> 'hello world'.rjust(48,'%')
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%hello world'
>>>
>>> '+' + 'hello world'.center(48,'*') + '+'
'+******************hello world*******************+'
>>> '+%s+' % 'hello'.center(50)
'+                      hello                       +'>>> 'hello'.upper()  # 转大写
'HELLO'
>>> 'HELLO'.lower()  # 转小写
'hello'
>>> 'hello'.startswith('h')   # 字符串以h开头吗?
True
>>> 'hello'.startswith('he')  # 字符串以he开头吗?
True
>>> 'hello'.endswith('ab')    # 字符串以ab结尾吗?
False
>>> 'hao123'.islower()   # 字母都是小写的吗?
True
>>> 'hao123'.isupper()   # 字母都是大写的吗?
False
>>> '1234'.isdigit()     # 所有的字符都是数字吗?
True# 判断是不是所有的字符都是数字字符
>>> s = '1234@11'
>>> for ch in s:
...   if ch not in '0123456789':
...     print(False)
...     break
... else:
...   print(True)
...
False

下一篇文将会教python的常用数据类型:列表,元组,字典,集合,想学习的同学一起学习。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 初识与入门

1. 什么是Redis Redis 是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务场景&#xff0c;比如 String(字符串)、…

论文阅读 (100):Simple Black-box Adversarial Attacks (2019ICML)

文章目录 1 概述1.1 要点1.2 代码1.3 引用 2 背景2.1 目标与非目标攻击2.2 最小化损失2.3 白盒威胁模型2.4 黑盒威胁模型 3 简单黑盒攻击3.1 算法3.2 Cartesian基3.3 离散余弦基3.4 一般基3.5 学习率 ϵ \epsilon ϵ3.6 预算 1 概述 1.1 要点 题目&#xff1a;简单黑盒对抗攻…

mysql在ubuntu上命令行登陆密码不正确

1.登陆提示如下 2.使用mysql -u root -p登录也是类似的 3.打开宝塔面板 点击root密码&#xff0c;更改密码后即可在命令行界面登录 4.登录效果如下

大数据Flink(七十八):SQL 的水印操作(Watermark)

文章目录 SQL 的水印操作(Watermark) 一、为什么要有 WaterMark

论数据库的种类

摘要 数据库是现代信息管理和数据存储的重要工具&#xff0c;几乎在各个领域都有广泛应用。不同类型的数据库适用于不同的应用场景和需求。本文将介绍几种常见的数据库种类&#xff0c;并探讨它们的特点和适用范围。 正文 一、关系型数据库&#xff08;RDBMS&#xff09; 关…

02JVM_垃圾回收GC

二、垃圾回收GC 在堆里面存放着java的所有对象实例&#xff0c;当对象为“死去”&#xff0c;也就是不再使用的对象&#xff0c;就会进行垃圾回收GC 1.如何判断对象可以回收 1.1引用计数器 介绍 在对象中添加一个引用计数器&#xff0c;当一个对象被其他变量引用时这个对象…

C++中使用R“()“标记符书写多行字符串

在C#中使用表示的字符串能够跨越数行。用于在C#中写JS或SQL代码比较方便。 string sqlInsert "INSERT INTO tb_param(protocol, slave, number, ptype, pid, name, format) VALUES(2, 24, 0, 1, 1, a04005, .3);INSERT INTO tb_param(protocol, slave, number, ptype, …

stm32---外部中断

一、EXTI STM32F10x外部中断/事件控制器&#xff08;EXTI&#xff09;包含多达20个用于产生事件/中断请求的边沿检测器。EXTI的每根输入线都可单独进行配置&#xff0c;以选择类型&#xff08;中断或事件&#xff09;和相应的触发事件&#xff08;上升沿触发、下降沿触发…

HashMap初始化大小

1.参考阿里巴巴开发规范 2.写了个工具类 供大家参考 import java.util.HashMap;/*** 阿里巴巴开发规范* 【推荐】 集合初始化时&#xff0c; 指定集合初始值大小。* 说明&#xff1a; HashMap 使用 HashMap(int initialCapacity) 初始化&#xff0c;如果暂时无法确定集合大小…

计算机二级公共基础知识-2023

计算机基础知识&#xff1a; 计算机的发展&#xff1a; 第一台电子计算机eniac 埃尼阿克 1946 第一台存储程序计算机 edvac 艾迪瓦克 根据电子元器件的发展分类 1.电子管 2.晶体管 3.集成电路 4.超大规模继承电路 按照电脑的用途可以分为 专用计算机 专门用于处理…

OpenCV学习笔记(6)_由例程学习高斯图像金字塔和拉普拉斯金字塔

1 图像金字塔 图像金字塔是图像多尺度表达的一种。 尺度&#xff0c;顾名思义&#xff0c;可以理解为图像的尺寸和分辨率。处理图像时&#xff0c;经常对源图像的尺寸进行缩放变换&#xff0c;进而变换为适合我们后续处理的大小的目标图像。这个对尺寸进行放大缩小的变换过程…

【C++从0到王者】第二十九站:二叉搜索树常见题

文章目录 一、根据二叉树创建字符串二、二叉树的最近公共祖先1.解法一&#xff1a;递归2.解法二&#xff1a;借助栈来寻找路径 三、二叉搜索树与双向链表四、前序与中序构建二叉树五、中序与后序构建二叉树 一、根据二叉树创建字符串 题目链接&#xff1a;力扣第606题&#xff…