Python pexpect模塊

我們都知道桌面操作系統及其功能和工作原理。我們所有人都一定聽說過的一些最著名的操作系統是 Windows、Linux、macOS 和 ChromeOS。其中,chromeOS 也是一款基於 Linux 的桌面操作系統,增加了 Linux 和基於 Linux 的操作系統的普及度。由於增強的安全特性,Linux 是程序員和開發人員中非常流行的操作系統。但與此同時,在普通人中並不多,這種趨勢背後最大的原因是在基於 Linux 操作系統的桌面上操作和工作時使用的複雜命令。

現在,說到 Linux,它是類似 UNIX 的操作系統家族中的一個桌面操作系統,由 Linus Torvalds 於 1991 年 9 月 17 日首次發布。除了它的安全特性之外,另一個,或者我們可以說 Linux 最吸引人的地方,是它是一個基於自由開源軟件模型的開源自由許可軟件。與 windows 和許多其他桌面操作系統不同,Linux 是絕對免費的,人們可以下載數百個發行版的最新版本。Linux 向開發人員提供的其他特性是更快的解釋器和編譯器、進行大量定製的選項、更低的操作系統複雜性以及許多其他特性。但是如果我們沒有 Linux OS,還想用 Linux 命令怎麼辦。這樣做可能有很多原因,包括我們可能想熟悉 Linux 命令等。也許不是所有的編程語言,但是 Python 為我們提供了在 Windows 或任何其他操作系統上運行 Linux 命令的選項。為此,Python 有一個 pexpect 模塊,它為我們提供了使用其功能通過 Python 程序自動執行 Linux 命令的選項。因此,我們將了解 Python 的這個預期模塊,並了解如何使用它通過 Python 程序運行 Linux 命令。

Python pexpect模塊簡介

Pexpect 是一個 Python 包,用於執行許多功能,包括通過 Python 程序自動執行 Linux 命令,生成子進程,然後自動控制它們等。Pexpect 模塊是 Python 的一個非常豐富的模塊,它附帶了許多函數來執行許多不同的任務。Pexpect 模塊作為 span 子模塊工作,它響應預期的模式;我們定義使用 Python 程序來執行幾個功能。

下面是我們可以使用 Python 的 pexpect 模塊執行的一些有用的功能:

  • FTP 密碼,
  • 噓,
  • Telnet,
  • 自動化 Linux 命令和許多其他命令

Python 程序模塊的安裝

Pexpect 不是 Python 的內置包(它不會隨 Python 安裝一起安裝),這就是為什麼如果我們的系統中還沒有這個模塊,我們就必須執行這個模塊的安裝。我們應該首先確定系統中是否已經安裝了 pexpect 模塊,因為如果系統中沒有該模塊,我們將無法執行實現。如果我們的系統中還沒有安裝 pexpect 模塊,我們可以通過多種方法安裝這個模塊,在所有可能的安裝方法中,用 pip 安裝程序安裝 Pexpect 模塊是最簡單、最容易的一種。這就是為什麼我們將在本節中使用 pip installer 在我們的系統中安裝該模塊,在這種方法中,我們將使用以下 pip installer 命令:


pip install pexpect

我們必須在命令提示符終端 Shell 中寫入上面給出的命令,並且在寫入命令後,我們必須按回車鍵,以便 pip 安裝程序將開始在我們的系統中安裝該模塊。一旦這個模塊的安裝過程開始,將需要一段時間才能在我們的系統中成功安裝該模塊,我們必須等到那時。

如我們所見,我們的屏幕上會顯示一條成功安裝的消息,這意味着 pexpect 模塊現在已成功安裝到我們的系統中。現在,我們可以繼續進行 Pexpect 模塊的實現部分,並開始將其導入示例程序,以了解它的工作原理。

用 Pexpect 模塊自動執行 Linux 命令

在這一部分中,我們將通過 Python 程序將 Pexpect 模塊導入其中來自動執行 Linux 命令。我們在 pexpect 模塊中有三種方法,我們可以使用它們通過 Python 程序自動執行 Linux 命令。

下面是我們可以用來自動化 Linux 命令的 pexpect 模塊的三種方法:

  • 使用 run()方法
  • 使用種子類方法
  • 使用 sendline()方法

我們將通過在一個示例程序中使用上面列出的三種方法來理解它們的實現。我們將為每種方法使用一個單獨的示例程序,並通過它自動執行 Linux 命令。

注意:上面列出的所有 pexpect 模塊方法只能在基於 UNIX 的操作系統中運行,沒有一個適用於 windows。因此,如果我們運行這些方法或示例程序,它將在輸出中顯示一個錯誤。首先,如果我們想在視窗操作系統中運行這些程序,我們必須為基於 UNIX 的操作系統建立一個虛擬環境。

方法 1:使用 run()方法

我們在 pexpect 模塊中有一個 run()函數,可以用來運行和執行命令。我們可以使用 pexpect.run()方法通過在函數中提供一個參數來執行一個 Linux 命令,然後,我們可以在輸出中返回執行的結果。run()函數可以替代 os.system 方法,後者用於執行 Linux 命令。

run()方法的語法:

以下是使用 pexpect 模塊的 run()方法執行 Linux 命令的語法:


>> pexpect.run(Linux command)

正如我們在上面的語法中看到的,我們在 run()方法中提供了一個 Linux 命令作為參數。當我們運行程序時,run()方法將執行提供的 Linux 命令,並在輸出中顯示結果。

讓我們通過下面的示例程序來理解用於執行 Linux 命令的 run()方法的實現。

示例 1: 看看下面的 Python 程序,我們在其中執行了一個 Linux 命令:


# Importing pexpect module
import pexpect as px
# Using run method with Linux command
executionResult = px.run('echo Welcome to JavaTpoint!')
# Showing result in the output
print("The result after executing Linux commands through run method:")
print(executionResult)

輸出:

The result after executing Linux commands through run method:
Welcome to JavaTpoint!

我們可以看到,Linux 命令成功執行,結果打印在輸出中。

說明:

在程序中將 pexpect 模塊作為 px 導入後,我們使用了 run()方法和一個示例 Linux 命令來回應‘歡迎來到 javapoint!’我們將其存儲在一個初始化的變量中,即 executionResult。最後,我們使用 print 語句在輸出中打印執行結果。

方法 2:使用種子類方法

在這個方法中,我們將使用一個種子類來幫助我們自動化程序中給出的 Linux 命令。產卵類是主界面,通過它我們可以在執行過程中啟動一個新的子進程,並通過子類控制它。我們在種子類中給出的字符串參數可以被 shell 命令替換(只要需要),它必須在程序中執行。

產卵類語法:


>> pexpect.spawn('Linux Command')

正如我們所看到的,我們已經在產卵類中提供了一個 Linux 命令作為參數,並且它可以被 shell 命令替換,shell 命令必須被執行。

在使用產卵類方法時,我們可以使用 expect()函數,這也是產卵類的一個重要方法。expect()方法等待子類(由我們為種子類定義)處理,以便它將返回給定的字符串輸入之一。當我們運行程序時,我們將在種子類函數中指定的模式將與子類中定義的輸入字符串匹配,匹配的字符串將在輸出中返回。子類中使用的 expect()將返回輸出中與種子類的輸入模式匹配的字符串位置。

expect()函數的語法:

我們必須在派生方法的子類中使用 expect()函數,如下所示的語法:


>> childClassObject.expect(inputPatterns, searchwindowsize = -1, async_ = false)

參數:正如我們在上面給出的 expect()函數的語法中可以看到的,這個函數採用了以下三個參數:

  1. 輸入模式:這些是輸入字符串模式,將與我們在種子類中定義的模式相匹配,這是要在函數中給出的強制參數。
  2. searchwindowsize: 它是一個可選的窗口大小,定義了搜索窗口的大小。函數中此參數的默認值為-1。
  3. async_: 這也是 expect()函數的可選參數,該參數的輸入值為“真”和“假”函數中此參數的默認值為 False。在創建非阻塞應用時,我們可以將該值設置為“真”。

expect()函數中用於提升返回值的超時值將是 pexpect.TIMEOUT。我們可以使用 expect()函數的 searchwindow 選項來設置類的 maxread 值。

讓我們通過下面的示例程序來理解子類中帶有 expect()函數的產卵類方法的實現。

示例 2: 看看下面的 Python 程序,其中我們匹配了在種子類中定義的輸入模式:


# Importing pexpect module
import pexpect as px
# Starting a child process with spawn class
childProcess = px.spawn("echo JavaTpoint")
# Matching the defined pattern with input strings of expect() function
processResult = childProcessing.expect(["Welcome", "To", "JavaTpoint", "Hello"])
# Returning matched string index result in the output
print("The defined pattern in the spawn class is matched at the index number:", processResult, "from the input strings given in expect function")

輸出:

The defined pattern in the spawn class is matched at the index number: 2 from the input strings given in expect function

正如我們所看到的,與定義的模式相匹配的輸入字符串的索引號在執行產卵類後被打印在輸出中。這就是我們如何在子進程中將 expect()函數中給出的輸入字符串與種子類中定義的模式進行匹配。由於索引編號從 0 開始,這就是為什麼在第 3 個位置為輸入字符串的位置打印索引編號 2。

說明:

在程序中將 pexpect 模塊作為 px 導入後,我們使用了 spawn 類來啟動一個子進程。在啟動子進程時,我們已經將一個模式定義為“JavaTpoint”,它將與給定的輸入字符串相匹配。之後,我們使用了 expect()函數,在這裡我們定義了多個輸入字符串。將與定義的模式匹配的字符串的索引號將作為結果存儲在初始化的變量中。最後,我們通過在 print 語句中使用初始化變量來打印結果。

方法 3:使用發送線方法

在這個方法中,我們將在用種子類啟動子進程後使用 sendline()函數。sendline()方法將重寫為子進程定義的模式的字符串。Sendline 方法也用於返回由我們定義的模式字符串所消耗的字節數,但是在這一部分中,我們將只使用這個方法來匹配來自輸入字符串的模式。當我們為子進程編寫字符串時,這個方法用於自動執行 Linux 命令。

發送線方法的語法:

以下是使用 pexpect 模塊的 sendline 方法為子進程編寫匹配模式的語法:


>> childProcess.sendline("pattern")

我們可以看到,sendline 函數只接受一個參數,這是子進程的模式。

我們可以通過下面的示例程序了解 sendline 方法的實現和應用:

示例 3: 看看下面的 Python 程序,其中我們使用了 sendline()函數為子進程編寫匹配模式:


# Importing pexpect module
import pexpect as px
# Starting a child process with spawn class
childProcess = px.spawn("JavaTpoint")
# Definite pattern for the child process
childProcess.sendline("Welcome")
# Matching defined pattern with input strings
processResult = childProcessing.expect(["Welcome", "To", "JavaTpoint", "Hello"])
# Returning matched string index result in the output
print("The defined pattern for the child process by the sendline method is matched at the index number: ", processResult)

輸出:

The defined pattern for the child process by the sendline method is matched at the index number: 0

如我們所見,expect()函數的輸入字符串與 sendline 方法定義的模式相匹配的索引號在執行後打印在輸出中。這就是我們如何使用 sendline 方法為子進程定義和匹配模式。

說明:

在啟動子進程之後,我們使用了 sendline()函數,在這裡我們定義了子進程的模式。然後,我們將定義的模式與 expect()函數中給出的輸入字符串進行匹配。最後,我們打印了輸入字符串的索引號,它與為子進程定義的模式相匹配。


原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/300269.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-29 12:51
下一篇 2024-12-29 12:51

相關推薦

  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29

發表回復

登錄後才能評論