今天是個好日子。
如今,Python 是最常用的語言之一,不僅用於創建軟體產品本身,還提供其基礎設施。 結果,許多開發人員,無論是自願的還是反對的,都必須學習一門新的語言,以便以後用作舊的 Bash 腳本的補充。 然而,Bash 和 Python 的程式碼編寫方法不同,並且具有某些特性,這意味著將 Bash 腳本移植到「蛇語言」有時會是一項艱鉅且絕非微不足道的任務。
為了讓 DevOps 的工作變得更輕鬆,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
這個想法是這樣的:
- 代表 Python 世界中的 Bash 的單一類別;
- 每個 Bash 命令都以 Shell 類別的函數來呼叫;
- 然後將每個函數呼叫的參數傳遞到對應的 Bash 命令呼叫中;
- 每個命令在呼叫時「此時此地」執行,即同步方法有效;
- 可以存取 stdout 中命令的輸出及其返回碼;
- 如果該命令不在系統中,則會拋出異常。
與 smart-env 一樣,支援 Python 2(儘管需要付出更多犧牲),但不支援 Python 3.0-3.4。
圖書館發展計劃
現在您可以使用這些函式庫:它們都發佈在官方 PyPI 上。 原始碼可在 Github 上找到(見下文)。
這兩個庫的開發都將考慮從感興趣的人那裡收集的回饋。 而且,如果在 smart-env 中想出各種新功能可能很困難,那麼在 python-shell 中肯定還需要添加其他內容:
- 支援非阻塞調用;
- 與團隊互動溝通的可能性(使用標準輸入);
- 新增屬性(例如,從 stderr 接收輸出的屬性);
- 實作可用指令的目錄(與 dir() 函數一起使用);
- 等等
引用
更新23.02.2020:
* 儲存庫已移動,對應的連結已更新
* 版本 python-shell==1.0.1 正在準備於 29.02.2020 年 XNUMX 月 XNUMX 日發布。 變更包括對命令自動完成和 dir(Shell) 命令的支援、使用無效 Python 標識符運行命令以及錯誤修復。
來源: www.habr.com