建立 Python 和 Bash 友誼:smart-env 和 python-shell 函式庫

今天是個好日子。

如今,Python 是最常用的語言之一,不僅用於創建軟體產品本身,還提供其基礎設施。 結果,許多開發人員,無論是自願的還是反對的,都必須學習一門新的語言,以便以後用作舊的 Bash 腳本的補充。 然而,Bash 和 Python 的程式碼編寫方法不同,並且具有某些特性,這意味著將 Bash 腳本移植到「蛇語言」有時會是一項艱鉅且絕非微不足道的任務。

為了讓 DevOps 的工作變得更輕鬆,Python 中已經創建並繼續創建了許多有用的程式庫和實用程式。 本文介紹了本文作者創建的兩個新庫 - 智慧環境 и 蟒蛇殼 - 旨在使開發人員無需過多關注使用 Python 的複雜性,從而為更有趣的任務留出空間。 庫的活動範圍是環境變數和啟動外部實用程式。

有興趣的可以看看貓。

新“自行車”?

看起來,為什麼要為相當普通的操作創建新的套件呢? 是什麼阻止您直接使用 os.environ 和 subprocess.<method or class of your choice> ?

我將分別提供有利於每個圖書館的證據。

智慧環境庫

在編寫自己的創意之前,上網尋找現成的解決方案很有用。 當然,有找不到你需要的東西的風險,但這更像是一個「保險事件」。 一般來說,這種方法很有效,並且可以節省大量時間和精力。

根據結果 搜索 透露了以下資訊:

  • 有些套件實際上包裝了對 os.environ 的調用,但同時需要一堆分散注意力的操作(創建類別的實例、調用中的特殊參數等);
  • 有一些很好的包,但是它們嚴格依賴特定的生態系統(主要是像 Django 這樣的 Web 框架),因此如果沒有文件就根本不通用;
  • 很少有人嘗試做新的事情。 例如, 添加打字 並透過呼叫類似方法明確解析變數值
    get_<typename>(var_name)

    或在這裡 另一種解決方案,然而,它不支援現在不光彩的Python 2(儘管 官方安息日,仍然有堆積如山的書面代碼和整個生態系統);

  • 有學校學生的工藝,沒有明顯的原因它們最終出現在上游 PyPI 中,只會在新包的命名方面產生問題(特別是,名稱“smart-env”是必要的措施)。

而且這個清單還可以持續很久。 然而,以上幾點足以讓我對製作方便且通用的東西的想法感到興奮。

在編寫 smart-env 之前設定的要求:

  • 最簡單的使用方案
  • 易於配置的數據類型支持
  • 相容於Python 2.7
  • 通過測試良好的程式碼覆蓋率

最終,這一切都實現了。 這是一個使用範例:

from smart_env import ENV

print(ENV.HOME)  # Equals print(os.environ['HOME'])

# assuming you set env variable MYVAR to "True"

ENV.enable_automatic_type_cast()

my_var = ENV.MY_VAR  # Equals boolean True

ENV.NEW_VAR = 100  # Sets a new environment variable

正如您從範例中看到的,要使用新類,您只需導入它(不需要建立實例 - 減去額外的操作)。 對任何環境變數的存取都是透過將其引用為 ENV 類別的變數來實現的,這實際上使該類別成為本機系統環境的直觀包裝器,同時將其轉變為幾乎任何系統的可能配置物件(例如,在Django 中實作了類似的方法,只是配置物件是設定模組/套件本身)。

啟用/停用自動類型支援模式是使用兩種方法實現的:enable_automatic_type_cast() 和disable_automatic_type_cast()。 如果環境變數包含序列化的類似JSON 的對象,甚至只是一個布林常數,這會很方便(透過將環境變數與「有效」字串進行比較來明確設定Django 中的DEBUG 變數是最常見的情況之一)。 但現在不需要明確轉換字串 - 大多數必要的操作已經嵌入到庫的深處,只是等待訊號來執行。 🙂 一般來說,輸入是透明的,並且支援幾乎所有可用的內建資料類型(frozenset、complex 和 bytes 未測試)。

支援 Python 2 的要求幾乎沒有做出任何犧牲(放棄輸入和最新版本 Python 3 的一些「糖果」),特別是得益於無處不在的六種(解決使用元類別的問題) )。

但有一些限制:

  • Python 3 支援意味著 3.5 及更高版本(它們出現在你的專案中是因為懶惰或缺乏改進的需要,因為很難找出為什麼你仍然使用 3.4 的客觀原因);
  • 在 Python 2.7 中,該函式庫不支援集合文字的反序列化。 描述 這裡。 但如果有人想實現它,歡迎你:);

該函式庫還有一個異常機制,以防解析錯誤。 如果任何可用的分析器都無法識別該字串,則該值仍然是一個字串(而是為了方便以及向後相容變數在 Bash 中工作的通常邏輯)。

python-shell 函式庫

現在我將向您介紹第二個庫(我將省略對現有類似物的缺點的描述 - 它與 smart-env 的描述類似。類似物 - 這裡 и 這裡).

總的來說,實現的思路和要求與smart-env的描述類似,從例子可以看出:

from python_shell import Shell

Shell.ls('-l', '$HOME')  # Equals "ls -l $HOME"

command = Shell.whoami()  # Equals "whoami"
print(command.output)  # prints your current user name

print(command.command)  # prints "whoami"
print(command.return_code)  # prints "0"
print(command.arguments)  # prints ""

Shell.mkdir('-p', '/tmp/new_folder')  # makes a new folder

這個想法是這樣的:

  1. 代表 Python 世界中的 Bash 的單一類別;
  2. 每個 Bash 命令都以 Shell 類別的函數來呼叫;
  3. 然後將每個函數呼叫的參數傳遞到對應的 Bash 命令呼叫中;
  4. 每個命令在呼叫時「此時此地」執行,即同步方法有效;
  5. 可以存取 stdout 中命令的輸出及其返回碼;
  6. 如果該命令不在系統中,則會拋出異常。

與 smart-env 一樣,支援 Python 2(儘管需要付出更多犧牲),但不支援 Python 3.0-3.4。

圖書館發展計劃

現在您可以使用這些函式庫:它們都發佈在官方 PyPI 上。 原始碼可在 Github 上找到(見下文)。

這兩個庫的開發都將考慮從感興趣的人那裡收集的回饋。 而且,如果在 smart-env 中想出各種新功能可能很困難,那麼在 python-shell 中肯定還需要添加其他內容:

  • 支援非阻塞調用;
  • 與團隊互動溝通的可能性(使用標準輸入);
  • 新增屬性(例如,從 stderr 接收輸出的屬性);
  • 實作可用指令的目錄(與 dir() 函數一起使用);
  • 等等

引用

  1. 智慧環境庫: Github上 и 的PyPI
  2. python-shell 函式庫: Github上 и 的PyPI
  3. 電報頻道 圖書館更新

更新23.02.2020:
* 儲存庫已移動,對應的連結已更新
* 版本 python-shell==1.0.1 正在準備於 29.02.2020 年 XNUMX 月 XNUMX 日發布。 變更包括對命令自動完成和 dir(Shell) 命令的支援、使用無效 Python 標識符運行命令以及錯誤修復。

來源: www.habr.com

添加評論