Python 运行 shell 命令的一些方法

这篇具有很好参考价值的文章主要介绍了Python 运行 shell 命令的一些方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈喽大家好,我是咸鱼

我们知道,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 异常文章来源地址https://www.toymoban.com/news/detail-573950.html

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 命令的一些方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux 查询正在运行的shell脚本命令

    1.查看当前运行的所有进程。 ps -A 2.如果太多了找不到,看的眼花,可以加条件 grep是分组 查看正在运行的shell脚本的进程shell脚本就是 sh ps -ef |grep  sh 如图下面就是查询出来的所有sh脚本,看第三列就是脚本的进程UID,直接杀死UID就行    3.杀死进程UID kill  4491 如图 直接杀

    2024年02月12日
    浏览(37)
  • 【Linux】Shell命令运行原理和权限详解

    tar指令(重要): 打包/解包,不打开它,直接看内容 语法:tar [-cxtzjvf] 文件与目录 … 参数: 常用的为: (1)-c :建立一个压缩文件的参数指令(create 的意思); (2)-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩 (3)-f :使用档名,请留意,在 f 之后要立即接

    2024年03月14日
    浏览(95)
  • 【Linux】Shell脚本中获取命令运行的结果

    写shell脚本的时候,常需要将一个命令的运行结果做为参数传递给另外一个命令,除了我们熟知的管道 | 和args,我们也可以通过获取命令的运行结果。 执行结果: 来点复杂的应用: 再比如: 😉 运行结果: 把反引号``换成$()即可 反引号不支持嵌套,而 $ 支持嵌套。 举个例

    2024年02月11日
    浏览(28)
  • 深入篇【Linux】学习必备:Shell命令运行原理 + 基本指令

    Linux严格意义上来说是一个操作系统,我们称为\\\"核心\\\",但我们一般用户,是不能直接使用这个\\\"核心\\\"。而是通过\\\"核心\\\"的外壳程序,也就是所谓的Shell来与\\\"核心\\\"沟通。 其实我们所有的指令都要在OS内部运行,但是OS使用的难道太高,我们用户很难直接与OS打交道。 从技术角度

    2024年02月07日
    浏览(74)
  • shell命令或脚本 调用远程jenkins并运行job

            可以使用job中的token,shell命令调用执行。   shell调用jenkins进行构建时,报错: Error 403 No valid crumb was included in the request HTTP Status 403 – Forbidden The server understood the request but refuses to authorize it 解决办法: 在Jenkins启动命令中,添加crsf关闭配置。 添加启动参数:-Dh

    2024年02月14日
    浏览(31)
  • Python调用Shell命令 (python,shell 混合编程)

    Python经常被称作“胶水语言”,因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库,也当然可以用Python调用Shell命令。 用Python调用Shell命令有如下几种方式: os .system( \\\"The command you want\\\" ). os .system( \\\"lscpu\\\" ). os .system( \\\"ls -al\\\" ). 这个调用相当直接,且是同步进行的

    2024年02月16日
    浏览(36)
  • 免费分享一些Open Ai的key,供大家使用

    谁创造了ChatGPT? ChatGPT由人工智能和研究公司OpenAI创建。该公司于2022年11月30日发布推出了ChatGP OpenAI还负责创建流行的画图模型DALL-E和自动语音识别系统Whisper。 ChatGPT官方的运营成本大概是多少? GPT-3 训练一次的成本约为 140 万美元。 对于一些更大的 LLM(大型语言模型),

    2024年02月05日
    浏览(73)
  • 微软官宣裁员 10000 人。分享一些我的建议给大家

    大家好!我是韩老师。 昨天,西雅图双雄经历着不眠之夜。 早些时间,就有传言说 1 月 18 日,亚马逊会裁员 18000 人。微软要裁员的各种消息也是满天飞。 北京时间昨天晚上,微软官方博客发了一篇标题为 Focusing on our short- and long-term opportunity 的文章。 其中,提及了裁员的

    2024年02月10日
    浏览(37)
  • Vivado时序约束TCL命令——获取引脚(get_pins)在FPGA设计中起着重要作用。本文将为大家详细介绍get_pins命令的语法和使用方法。

    Vivado时序约束TCL命令——获取引脚(get_pins)在FPGA设计中起着重要作用。本文将为大家详细介绍get_pins命令的语法和使用方法。 get_pins命令用于获取指定对象(Object)的引脚(Pin)列表。我们可以使用get_pins来获取具有特定命名约定的引脚(如CLOCK、RESET等),并通过对这些引

    2024年02月05日
    浏览(31)
  • 经实测利用POSTMAN根本无法进行并发测试,大家不要再被一些搬运工给误导了

    以下为我的实测记录 一、先上我测试的接口代码,就是一个redis的tryLock分布式锁的获取,接口在获取到锁后,线程sleep了5秒,此时线程是不释放锁的,那按道理第二个请求在这个时间进来,是获取不到锁的,但结果却不是这样的 二、按照网上的那些博文,postman操作步骤如下

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包