哈喽大家好,我是咸鱼

我们知道,python 在自动化领域中被广泛应用,可以很好地自动化处理一些任务

就比如编写 Python 脚本自动化执行重复性的任务,如文件处理、数据处理、系统管理等需要运行其他程序或者与操作系统交互的任务

那么今天我们来看一下在 python 中如何运行 shell 命令来与操作系统交互

一般来讲,最好是用 python 自带的函数或模块,而不是直接调用其他程序或者操作系统的命令

我们来看一下 python 中有哪些自带模块或者方法可以实现

pathlib 模块

如果你需要创建或者删除文件/目录,检查文件是否存在或者改变权限等,你完全不需要使用操作系统的命令

你可以完全通过 pathlib 模块来实现,它有你需要的一切,甚至 globos.path 都可以不用

我们来简单看一下关于这个模块的例子

from pathlib import Path

# 创建一个Path对象表示当前工作目录
current_directory = Path.cwd()
print("当前工作目录:", current_directory) # 创建一个新的目录
new_directory = current_directory / "my_folder"
new_directory.mkdir()
print("创建新目录:", new_directory) # 创建一个新的文件
new_file = new_directory / "my_file.txt"
new_file.touch()
print("创建新文件:", new_file) # 写入文件
with new_file.open(mode='w') as f:
f.write("Hello, World!") # 读取文件内容
with new_file.open() as f:
content = f.read()
print("文件内容:", content) # 遍历目录中的文件
for file in new_directory.iterdir():
print("文件:", file) # 删除文件和目录
new_file.unlink()
new_directory.rmdir()
print("删除文件和目录:", new_file, new_directory)

tempfile 模块

在 Python 中临时创建和处理文件时,tempfile 模块提供了方便的方法

它可以在临时目录中创建临时文件和临时文件夹,并提供了一些便利的函数和类来管理这些临时文件

import tempfile

# 创建临时文件
temp_file = tempfile.NamedTemporaryFile(delete=False)
temp_file.write(b'This is a temporary file.')
temp_file.close() # 打印临时文件路径
print("临时文件路径:", temp_file.name) # 打开临时文件并读取内容
with open(temp_file.name, 'r') as f:
content = f.read()
print("临时文件内容:", content) # 创建临时目录
temp_dir = tempfile.TemporaryDirectory() # 打印临时目录路径
print("临时目录路径:", temp_dir.name) # 自动清理临时目录
temp_dir.cleanup()

shutil 模块

前面我们知道 pathlib 模块满足了 python 中大多数与文件相关的需求

如果需要例如复制,移动,删除或创建文件,可以使用 shutil 模块

import shutil

# 复制文件
shutil.copy('source_file.txt', 'destination_folder/') # 移动文件
shutil.move('source_file.txt', 'destination_folder/') # 删除文件
shutil.remove('file_to_be_deleted.txt') # 删除目录
shutil.rmtree('directory_to_be_deleted/') # 创建压缩文件
shutil.make_archive('archive', 'zip', 'source_folder/') # 解压缩文件
shutil.unpack_archive('archive.zip', 'destination_folder/')

os 模块

os 模块是 Python 中一个更老的、更底层的模块,提供了与操作系统交互和执行文件系统操作的功能

但是随着 python 的发展,越来越多面向对象的、更直观和易于使用的模块可以供大家使用

对于 os 模块,大家可以了解一下就行了

import os

print(os.getenv('PATH'))
# 获取环境变量PATH的值,并打印
# 示例输出:/home/martin/.local/bin:/usr/local/sbin:/usr/local/bin:... print(os.uname())
# 获取操作系统的信息,并打印
# 示例输出:posix.uname_result(sysname='Linux', nodename='...', release='...', version='...', machine='x86_64') print(os.times())
# 获取进程的CPU时间信息,并打印
# 示例输出:posix.times_result(user=0.01, system=0.0, children_user=0.0, children_system=0.0, elapsed=1740.63) print(os.cpu_count())
# 获取可用的CPU核心数量,并打印
# 示例输出:16 print(os.getloadavg())
# 获取系统的平均负载,并打印
# 示例输出:(2.021484375, 2.35595703125, 2.04052734375) old_umask = os.umask(0o022)
# 设置文件创建时的权限掩码,并将旧的掩码保存起来
# 在此处可以执行与文件相关的操作... os.umask(old_umask)
# 恢复旧的文件权限掩码

sh 模块

sh 模块不是 python 的标准模块,它是一个第三方模块,在使用之前我们需要安装它

pip install sh
import sh

# 在 $PATH 中运行任何命令...
print(sh.ls('-la'))
# 执行ls命令并打印输出
# 示例输出:
# total 36
# drwxrwxr-x 2 martin martin 4096 apr 8 14:18 .
# drwxrwxr-x 41 martin martin 20480 apr 7 15:23 ..
# -rw-rw-r-- 1 martin martin 30 apr 8 14:18 examples.py ls_cmd = sh.Command('ls')
print(ls_cmd('-la')) # 显式调用
# 使用Command对象执行ls命令并打印输出
# 示例输出与上述相同 # 如果命令不在PATH中:
custom_cmd = sh.Command('/path/to/my/cmd')
custom_cmd('some', 'args') # 执行自定义命令并传递参数 with sh.contrib.sudo:
# 使用'sudo'执行一些操作...
...
# 使用'sudo'执行一些操作的上下文环境

当我们通过 sh 模块去执行一些 shell 命令时,sh 模块会尝试在本地环境变量($PATH)中查找带有该名称的内置 shell 命令或二进制文件

如果没有找到,可以自己添加命令路径

custom_cmd = sh.Command('/path/to/my/cmd')
custom_cmd('some', 'args') # 执行自定义命令并传递参数

如果要将命令的输出写入到文件里面,可以使用 _out 参数

#相当于 ip address > /tmp/ipaddr
sh.ip.address(_out='/tmp/ipaddr')

我们在敲 shell 命令时通常会使用到管道符(|),在 sh 模块中通过 _in 参数来实现

print(sh.awk('{print $9}', _in=sh.ls('-la')))
# 等同于 "ls -la | awk '{print $9}'" print(sh.wc('-l', _in=sh.ls('.', '-1')))
# 等同于 "ls -1 | wc -l"

对于异常处理,我们可以简单地处理 ErrorReturnCodeTimeoutException 异常

try:
sh.cat('/tmp/doesnt/exist')
except sh.ErrorReturnCode as e:
print(f'Command {e.full_cmd} exited with {e.exit_code}')
# '/usr/bin/cat /tmp/doesnt/exist' 命令结果返回 1 curl = sh.curl('https://httpbin.org/delay/5', _bg=True)
try:
curl.wait(timeout=3)
except sh.TimeoutException:
print("Command timed out...")
curl.kill()

Python 运行 shell 命令的一些方法的更多相关文章

  1. python 调用shell命令三种方法

    #!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器: #!/usr/bin/env python这种用法是为了防止操作系统用户没有将pyth ...

  2. python 调用 shell 命令方法

    python调用shell命令方法 1.os.system(cmd) 缺点:不能获取返回值 2.os.popen(cmd) 要得到命令的输出内容,只需再调用下read()或readlines()等   ...

  3. java运行shell命令,chmod 777 xxx,改变权限无效的解决的方法。

    在java程序中运行shell命令,改变文件的权限.能够在命令行中运行 chmod 777 <span style="font-family: Arial, Helvetica, sa ...

  4. python执行shell命令

    1 os.system 可以返回运行shell命令状态,同时会在终端输出运行结果 例如 ipython中运行如下命令,返回运行状态status os.system('cat /etc/passwdqc ...

  5. 用Python调用Shell命令

    Python经常被称作“胶水语言”,因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库,也当然可以用Python调用Shell命令. 用Python调用Shell命令有如下几种方式: 第一种 ...

  6. 让你提前认识软件开发(23):怎样在C语言中运行shell命令?

    第1部分 又一次认识C语言 怎样在C语言中运行shell命令? [文章摘要] Linux操作系统具备开源等诸多优秀特性,因此在很多通信类软件(主流开发语言为C语言)中,开发平台都迁移到了Linux上, ...

  7. python 调用 shell 命令

    记录 python 调用 shell 命令的方法 加载 os 模块, 使用 os 类 import os; os.system("ls /");

  8. PHP 反引号运行Shell命令,C程序

    /********************************************************************* * PHP 反引号运行Shell命令,C程序 * 说明: ...

  9. python 调用shell命令的方法

    在python程序中调用shell命令,是件很酷且常用的事情…… 1. os.system(command) 此函数会启动子进程,在子进程中执行command,并返回command命令执行完毕后的退出 ...

  10. 【Devops】【docker】【CI/CD】关于jenkins构建成功后一步,执行的shell命令详解+jenkins容器运行宿主机shell命令的实现方法

    1.展示这段shell命令 +详解 #================================================================================= ...

随机推荐

  1. 一天吃透JVM面试八股文

    什么是JVM? JVM,全称Java Virtual Machine(Java虚拟机),是通过在实际的计算机上仿真模拟各种计算机功能来实现的.由一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一 ...

  2. 2021年蓝桥杯python真题-路径(数论+动态规划)(LCM、GCD和DP详细介绍)干货满满~

    欢迎大家阅读本文章 如果大家对LCM和GCD不是很熟悉,这篇文章将对你有帮助! 本文章也会把动态规划做一定的介绍 题目: GCD和LCM的讲解: GCD的实现-辗转相除法: 在数学中,辗转相除法,又称 ...

  3. [SDR] GNU Radio 系列教程(十四) —— GNU Radio 低阶到高阶用法的分水岭 ZMQ 的使用详解

    目录 1.前言 2.ZMQ 块的类型 3.ZMQ 块的使用 4.DEMO 4.1 同一台电脑上的两个流程图 4.2 不同电脑上的两个流程图 4.3 作为 REQ/REP 服务器的 Python 程序 ...

  4. Html/css 列表项 区分列表首尾

    列表项,有时需要判断列表首尾,来筛选设置样式 如上图,三个项有间隔,怎么保证设置了列表项之间的距离后,整体还水平居中显示呢? .item:not(:first-child) { margin-left ...

  5. 2022-12-02:有a块草莓蛋糕,有b块芝士蛋糕,两人轮流拿蛋糕, 每次不管是谁只能选择在草莓蛋糕和芝士蛋糕中拿一种, 拿的数量在1~m之间随意, 谁先拿完最后的蛋糕谁赢。 返回先手赢还是后手赢。

    2022-12-02:有a块草莓蛋糕,有b块芝士蛋糕,两人轮流拿蛋糕, 每次不管是谁只能选择在草莓蛋糕和芝士蛋糕中拿一种, 拿的数量在1~m之间随意, 谁先拿完最后的蛋糕谁赢. 返回先手赢还是后手赢. ...

  6. 聊聊Seata分布式解决方案AT模式的实现原理

    什么是Seata分布式事务解决方案 Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.为用户提供了AT.TCC.SAGA和XA事务模式,为用户打造一站式的分布式解决 ...

  7. KO之间互相调用

    需求 假设有两个KO,命名为moduleA.KO,moduleB.KO,现在要实现在moduleB.KO中调用moduleA.KO中的函数. 实现 ModuleA实现 源码: #include < ...

  8. flutter系列之:做一个下载按钮的动画

    目录 简介 定义下载的状态 定义DownloadButton的属性 让DownloadButton的属性可以动态变化 定义downloadController 定义DownloadButton的细节 ...

  9. odoo部署安全性问题

    本文档描述在生产中或在面向Internet的服务器上设置Odoo的基本步骤.它是在安装之后进行的,对于没有在internet上公开的开发系统来说,它通常不是必需的.警告如果您正在设置公共服务器,请务必 ...

  10. 「高频面试题」Redis的持久化方式有哪些?

    RDB RDB(Redis DataBase)持久化是把当前Redis中全部数据生成快照保存在硬盘上.RDB持久化可以手动触发,也可以自动触发.save和bgsave命令都可以手动触发RDB持久化.除 ...