Python 運行 shell 命令的一些方法

来源:https://www.cnblogs.com/edisonfish/archive/2023/07/17/17560956.html
-Advertisement-
Play Games

哈嘍大家好,我是鹹魚 我們知道,python 在自動化領域中被廣泛應用,可以很好地自動化處理一些任務 就比如編寫 Python 腳本自動化執行重覆性的任務,如文件處理、數據處理、系統管理等需要運行其他程式或者與操作系統交互的任務 那麼今天我們來看一下在 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 異常

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()

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • 對於這兩個十分接近的設計模式,確實容易產生困惑,代理模式和裝飾器模式看起來十分相似,都是由兩個類實現相同的介面,然後一個類套另一個類。這件事足足困擾了我5分鐘之久,在此總結一下它們的差別。 ## 目的不同 當你想要增強你的類,給你的類增加新功能的話,你就該使用裝飾器模式了。 裝飾器模式由於添加了功能 ...
  • # 【RabbitMQ】當隊列中消息數量超過最大長度的淘汰策略 ## 說明 最近在研究RabbitMQ如何實現延時隊列時發現消息進入死信隊列的情況之一就是當消息數量超過隊列設置的最大長度時會被丟入死信隊列,看到這時我就產生了一個疑問,到底是最後插入的消息還是最早插入的消息會被丟入死信隊列呢?遺憾的是 ...
  • 淺克隆(shallow clone)和深克隆(deep clone)是兩種不同的對象複製方法。 淺克隆會創建一個新對象,然後將原始對象的所有欄位複製到新對象中。如果欄位是基本類型,則它們的值將被直接複製。如果欄位是引用類型,則只會複製引用,而不會複製引用指向的對象。這意味著原始對象和克隆對象中的引用 ...
  • 在最近發佈的Spring 6.1 M2版本中,推出了一個全新的同步HTTP客戶端:`RestClient`。用一句話來讓Spring開發者認識`RestClient`的話:像`WebClient`一樣具備流暢API的`RestTemplate`。所以,`RestClient`的使命就是淘汰已經有14 ...
  • ## 背景 一直以來習慣用docker配置一些本地學習環境,許多教程配置activiti的方式都是通過複製activiti的war包部署在tomcat中,我嘗試了一下通過docker的方式遇到了一些不易察覺的錯誤。 ## 使用方式描述 1. 使用docker安裝tomcat9.0 `docker r ...
  • # 1. 迴圈依賴 ## 1.1 什麼是迴圈依賴 首先,什麼是迴圈依賴?這個其實好理解,就是兩個 Bean 互相依賴,類似下麵這樣: """ @Service public class AService { @Autowired BService bService; } @Service publi ...
  • Go語言流媒體開源項目 [LAL](https://github.com/q191201771/lal) 今天發佈了v0.36.7版本。 > LAL 項目地址:https://github.com/q191201771/lal 老規矩,簡單介紹一下: ▦ Customize Sub,我有的都給你 這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...