如何在Python中建立和使用命名管道?


考慮一個管道,它允許在複雜系統的各個元件之間實現無縫的資料流和通訊。命名管道類似於 Python 程式設計中的管道,使程式更容易彼此通訊以及與其他程序通訊。命名管道,也稱為 FIFO(先進先出),是交換同一系統上或甚至系統之間程序之間資料的一種強大方法。在本文中,我們將深入 Python,學習如何建立和使用命名管道。我們將逐步分解建立命名管道的過程,透過它寫入和讀取資料,甚至展示高階場景。因此,讓我們探索命名管道的世界,並發現它們的潛力!

理解命名管道是什麼

命名管道是存在於 Python 檔案系統中的特殊檔案,其作用類似於傳統管道。與僅限於父程序和子程序之間通訊的匿名管道相反,命名管道超越了程序邊界。因此,命名管道可用於在彼此無關的程序之間進行通訊,使其成為一項寶貴的工具。

命名管道類似於檔案,但它不儲存任何內容。它只有一個路徑。它可以開啟、讀取和寫入,但內容臨時儲存在系統記憶體中。它的行為與普通檔案略有不同。當它被開啟時,它可以以只讀或只寫方式開啟,而不能同時以讀寫方式開啟。其理念是,您將有一個程序以寫入方式開啟它(伺服器),另一個程序以讀取方式開啟它(客戶端)。

如何建立命名管道?

要在 Python 中建立命名管道,我們使用 os 模組。讓我們首先匯入它。

import os

然後,我們為命名管道宣告路徑和名稱。

pipe_path = "/path/to/named_pipe"

我們使用 os 模組的 mkfifo() 函式建立命名管道。

示例

使用此程式碼已成功在指定路徑建立了一個命名管道。需要注意的是,命名管道只能被具有適當許可權的程序訪問。

os.mkfifo(pipe_path)

使用已知管道寫入

讓我們找到一種方法,如何在已構建的命名管道中插入資料。在此示例中,我們將使用 open() 函式以寫入模式開啟命名管道並將資料寫入其中。

示例

透過以寫入模式開啟命名管道,我們還可以使用 write() 方法透過它傳送資料。在此示例中,我們看到字串“Hello, named pipe!”被寫入。

with open(pipe_path, "w") as pipe:
   pipe.write("Hello, named pipe!")

從命名管道讀取

為了從命名管道讀取資料,我們以讀取模式開啟命名管道並使用 read() 或 readline() 方法。

示例

在此特定示例中,我們在以讀取模式開啟命名管道後使用 read() 方法獲取資料。然後將資料列印到控制檯。

with open(pipe_path, "r") as pipe:

   data = pipe.read()
   print(data)

清理命名管道

在完成命名管道的操作後,我們需要將其清理並從檔案系統中刪除。這可以透過 os.remove() 函式來實現。

示例

例如,我們透過呼叫 os.remove() 函式並提供其路徑來從檔案系統中刪除命名管道。這確保了乾淨的退出並防止資源洩漏。

os.remove(pipe_path)

首先,我們匯入 os 和 posix 模組並指定命名管道的路徑和名稱。之後,我們實現一個 try-except 塊來處理建立命名管道過程中可能出現的任何異常。在 try 塊中,posix.mkfifo() 函式用於在指定路徑建立命名管道。我們顯示一條訊息,指示命名管道已成功生成。如果命名管道已存在,我們會通知使用者。如果發生其他錯誤,我們會捕獲錯誤並顯示相應的錯誤訊息。

import os
import posix

pipe_path = "/content/named_pipe"

try:
   posix.mkfifo(pipe_path)
   print("Named pipe created successfully!")
except FileExistsError:
   print("Named pipe already exists!")
except OSError as e:
   print(f"Named pipe creation failed: {e}")

在此特定情況下,輸出為

Named pipe already exists!

示例

在此示例中,我們匯入 os 模組並宣告命名管道的路徑和名稱。然後,我們使用 try-except 塊來處理從命名管道讀取資料期間可能出現的異常情況。在 try 塊中,我們使用 open() 方法以讀取模式開啟命名管道後,使用 read() 方法讀取資料。我們將資料儲存在 data 變數中後,將其顯示到控制檯。如果沒有名為命名管道的檔案,我們將捕獲 FileNotFoundError 並通知使用者。我們捕獲任何其他錯誤並顯示相應的錯誤訊息。

import os

# Specify the path and name of the named pipe
pipe_path = "/path/to/named_pipe"

# Read data from the named pipe
try:
   with open(pipe_path, "r") as pipe:
      data = pipe.read()
   print(f"Read data from named pipe: {data}")
except FileNotFoundError:
   print("Named pipe does not exist!")
except OSError as e:
   print(f"Failed to read data from named pipe: {e}")

輸出

在一個特定情況下,輸出可能是

Named pipe does not exist!

在這篇關於命名管道的有趣的 Python 文章中,您學習瞭如何在 Python 中建立、寫入和讀取命名管道中的資料。命名管道充當程序間通訊的強大中介或代理,並允許不同的程序無縫交換資料。透過提供的程式碼示例,您現在全面瞭解瞭如何在 Python 中建立和使用命名管道。

現在,您擁有了一個多功能工具,可以構建複雜的系統、協調程序並在 Python 專案中解鎖新的可能性,從而能夠建立和使用命名管道。因此,繼續前進,探索有關命名管道(包括 Python 程式之間高效通訊)的不同可能性。

更新於: 2023年7月17日

12K+ 瀏覽量

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.