我們都知道桌面操作系統及其功能和工作原理。我們所有人都一定聽說過的一些最著名的操作系統是 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()函數的語法中可以看到的,這個函數採用了以下三個參數:
- 輸入模式:這些是輸入字符串模式,將與我們在種子類中定義的模式相匹配,這是要在函數中給出的強制參數。
- searchwindowsize: 它是一個可選的窗口大小,定義了搜索窗口的大小。函數中此參數的默認值為-1。
- 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-hk/n/300269.html