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

news2024/11/25 20:51:49

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

《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 subprocess

def 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, choice


hi = 'Hello World'               # 全局变量
debug = True


class MyClass:                   # 类的定义
    pass


def func1():                     # 函数定义
    pass


if __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:
NAME
    star - 演示模块
DESCRIPTION
    辣鸡
FUNCTIONS
    pstar(n=30)
        用于打印n个星号
DATA
    hi = '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 os


def get_fname():
    '用于获取文件名'
    while 1 :
        fname =  input('文件名: ')
        if not os.path.exists(fname):
            break
        print('文件已存在,请重新输入: ')
    return fname


def 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 subprocess


def 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.coloradmin.cn/o/978841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接入Websocket,自动接收CSDN短消息

最近在研究Websocket功能&#xff0c;本来想接入抖音和快手的弹幕功能&#xff0c;以及短消息功能。 在了解的过程中&#xff0c;也开发了一些测试项目。 这不是&#xff0c;就把CSDN的短消息项目给弄出来了。 直接上代码&#xff1a; # !/usr/bin python3 # -*- encodingu…

U盘插电脑没反应?学会这3个方法就够了!

“谁能帮帮我呀&#xff01;u盘里有超级重要的文件哎&#xff01;但是将u盘插电脑后一点反应都没有&#xff01;我还需要将u盘里的文件导出来呢&#xff01;” U盘&#xff08;又称闪存驱动器或USB闪存驱动器&#xff09;是我们生活中常用的便携式存储设备之一&#xff0c;但在…

Python实现猎人猎物优化算法(HPO)优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

『虫无涯→_→读书推荐02期』|全面系统的〖Effective软件测试〗带你完成所有不同类型的测试,GO

目录 我看的书 我的书评/推荐理由 书籍的作者 书籍内容 赠书活动 我看的书 首次看到这本书的封面的时候&#xff0c;我被那个数字惊呆了&#xff0c;【助理软件研发提升10倍质量】&#xff0c;这对我产生了足够了吸引力。因为这个数字是非常的客观的&#xff1b;至于书…

DAY08_MyBatisPlus——入门案例标准数据层开发CRUD-Lombok-分页功能DQL编程控制DML编程控制乐观锁快速开发-代码生成器

目录 一 MyBatisPlus简介1. 入门案例问题导入1.1 SpringBoot整合MyBatisPlus入门程序①&#xff1a;创建新模块&#xff0c;选择Spring初始化&#xff0c;并配置模块相关基础信息②&#xff1a;选择当前模块需要使用的技术集&#xff08;仅保留JDBC&#xff09;③&#xff1a;手…

@PostConstruct使用

PostConstruct是Java自带的注解&#xff0c;在方法上加该注解会在项目启动的时候执行该方法&#xff0c;也可以理解为在spring容器初始化的时候执行该方法。 从Java EE5规范开始&#xff0c;Servlet中增加了两个影响Servlet生命周期的注解&#xff0c;PostConstruc

Goland2023版新UI的debug模式调试框按钮功能说明

一、背景 Jetbrains家的IDE的UI基本都是一样的&#xff0c;debug模式的调试框按钮排列也是一致的&#xff0c;但是在我使用Goland2023版的新UI时&#xff0c;发现调试框的按钮变化还是很大的&#xff0c;有一些按钮被收起来了&#xff0c;如果看之前的博客会发现有一些文中的旧…

15年安全老兵详解《孤注一掷》里的黑客技术及杀猪盘

做为网络安全从业者&#xff0c;今天谈谈电影《孤注一掷》涉及到的相关的黑客攻防技术和场景。 电影制作方也算是用心了&#xff0c;隔壁王大娘提醒我男主张艺兴饰演的潘生与编程语言Python在读音上似乎有点弦外之音&#xff0c;有点类似或谐音。 开篇男主潘生从标准码农衬衫打…

排序算法:选择排序(直接选择排序、堆排序)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关排序算法的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

网络安全人才供需严重失衡,预计2027年缺口将扩大到300万人

网络安全法正式实施5年了。 这5年&#xff0c;是网络安全法治化体系化日趋完善的5年&#xff0c;也是我国网络安全产业黄金发展的5年。 赛迪顾问数据显示&#xff0c;2016年&#xff0c;我国网络安全市场规模为336.2亿元&#xff1b;而2021年&#xff0c;市场规模达到900多亿…

java IO流(四) 数据流 序列化流

数据流 再学习一种流&#xff0c;这种流在开发中偶尔也会用到,我们想把数据和数据的类型一并写到文件中去&#xff0c;读取的时候也将数据和数据类型一并读出来。这就可以用到数据流&#xff0c;有两个DataInputStream和DataOutputStream. DataOutputStream类 写入特定类型 D…

JS 方法实现复制粘贴

背景 以前我们一涉及到复制粘贴功能&#xff0c;实现思路一般都是&#xff1a; 创建一个 textarea 标签 让这个 textarea 不可见&#xff08;定位&#xff09; 给这个 textarea 赋值 把这个 textarea 塞到页面中 调用 textarea 的 select 方法 调用 document.execCommand…

Java逻辑控制

目录 一、顺序结构 二、分支结构 1、if语句 &#xff08;1&#xff09; 语法格式1​编辑 &#xff08;2&#xff09;语法格式2​编辑 &#xff08;3&#xff09;语法格式3 2、switch 语句 三、循环结构 1、while循环 2、break 3、continue 4、for 循环 5、do whil…

Pycharm通用设置个性化设置

Pycharm通用设置&个性化设置 通用设置取消打开Pycharm自动进入项目开启【Ctrl鼠标滑轮】放大缩小字体 个性化设置设置彩虹括号 通用设置 取消打开Pycharm自动进入项目 选择选择菜单【File】>【Settings】进入设置页面选择【Appearance & Behavior】>【System S…

dantax参数调优

dantax参数调优 1.speed调优 可能会导致数据倾斜 处理的速度不同&#xff0c;可能会导致job非常慢 举例子&#xff0c;比如总限速是每秒100条record&#xff0c;其中第一个channel速度是每秒99条record&#xff0c;第二个channel是每秒1条record&#xff0c;加起来是每条100条…

Helm Deploy Online Rancher Demo

文章目录 简介预备条件在线安装 Rancher Helm Chart选择 SSL 配置安装 cert-managerHelm 安装 Rancher验证 Rancher Server 是否部署成功 简介 Rancher 是一个开源的企业级全栈化容器部署及管理平台。已有超过 1900 万次下载&#xff0c;4000 生产环境的应用。 简单的说&…

医院如何选择跨网文件交换产品,提升业务效率?

我国医院根据国家信息安全相关法规要求&#xff0c;大多都采用网闸等隔离手段&#xff0c;将网络隔离为内网和外网&#xff0c;但网络隔离后&#xff0c;医院仍需要进行内外网间的文件交换&#xff0c;如患者的检测报告、学术研究等资料。而医院内的不同科室都存在内外网文件交…

被动元件库存“见底”,或迎涨价潮? | 百能云芯

近日&#xff0c;有消息称被动元件可能会涨价&#xff0c;这促使了被动元件相关股票的全面上涨。国内相关供应链表示&#xff0c;虽然目前没有涨价的条件&#xff0c;但经过长时间的库存消化&#xff0c;各种应用的库存几乎已经清空&#xff0c;只等待终端需求的回升。 自2021年…

软件测试/测试开发丨测试用例自动录入 学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27139 测试用例自动录入 测试用例自动录入的价值 省略人工同步的步骤&#xff0c;节省时间 兼容代码版本的自动化测试用例 用例的执行与调度统一化管理…

STM32--蓝牙

本文主要介绍基于STM32F103C8T6和蓝牙模块实现的交互控制 简介 蓝牙&#xff08;Bluetooth&#xff09;是一种用于无线通信的技术标准&#xff0c;允许设备在短距离内进行数据交换和通信。它是由爱立信&#xff08;Ericsson&#xff09;公司在1994年推出的&#xff0c;以取代…