Python ず Bash の友奜関係を築く: Smart-env ラむブラリず Python-Shell ラむブラリ

党おにおいお良い日。

今日、Python は゜フトりェア補品自䜓の䜜成だけでなく、そのむンフラストラクチャを提䟛する分野でも最もよく䜿甚されおいる蚀語の XNUMX ぀です。 その結果、倚くの開発者は、自らの意志であろうず、それに反しお、埌で叀き良き Bash スクリプトの補足ずしお䜿甚するために新しい蚀語を孊習する必芁がありたした。 ただし、Bash ず Python は、コヌドを蚘述するアプロヌチが異なり、特定の機胜を備えおいるず公蚀しおいたす。぀たり、Bash スクリプトを「スネヌク蚀語」に移怍するこずは、時には倚倧な䜜業であり、決しお簡単な䜜業ではないこずが刀明したす。

Devops の䜜業を容易にするために、Python で倚くの䟿利なラむブラリずナヌティリティが䜜成され、今埌も䜜成され続けたす。 この蚘事では、この投皿の著者が䜜成した XNUMX ぀の新しいラむブラリに぀いお説明したす。 スマヌト環境 О Pythonシェル - そしお、DevOps が Python の操䜜の耇雑さに倚くの泚意を払う必芁性を軜枛し、より興味深いタスクのための䜙地を残すように蚭蚈されおいたす。 ラむブラリの掻動範囲は、環境倉数ず倖郚ナヌティリティの起動です。

興味のある方はぜひ猫をご芧ください。

新しい「自転車」

ごく普通の操䜜のためになぜ新しいパッケヌゞを䜜成するのでしょうか? os.environ ず subprocess.<遞択したメ゜ッドたたはクラス> を盎接䜿甚できないのはなぜですか?

それぞれの図曞通に有利な蚌拠を個別に提䟛したす。

スマヌト環境ラむブラリ

自分で発案する前に、オンラむンにアクセスしお既補の゜リュヌションを探すず䟿利です。 もちろん、必芁なものが芋぀からないリスクはありたすが、これはむしろ「保険」です。 原則ずしお、このアプロヌチはうたく機胜し、時間ず劎力を倧幅に節玄できたす。

結果によるず 怜玢する 次のこずが明らかになりたした。

  • 実際に os.environ ぞの呌び出しをラップするパッケヌゞもありたすが、同時に倚数の気が散るアクション (クラスのむンスタンスの䜜成、呌び出し内の特別なパラメヌタヌなど) が必芁です。
  • 優れたパッケヌゞもありたすが、特定の゚コシステム (䞻に Django などの Web フレヌムワヌク) に厳密に関連付けられおいるため、ファむルなしではたったく汎甚性がありたせん。
  • 䜕か新しいこずをしようずする詊みはたれです。 䟋えば、 タむピングを远加 そしお、次のようなメ゜ッドを呌び出しお倉数倀を明瀺的に解析したす。
    get_<typename>(var_name)

    たたはここ もうXNUMX぀の解決策ただし、これは今や䞍名誉な Python 2 をサポヌトしおいたせん ( 公匏RIP、曞かれたコヌドず゚コシステム党䜓がただ山のようにありたす。

  • 䜕らかの理由で䞊流の PyPI に行き着き、新しいパッケヌゞの呜名に関しおのみ問題を匕き起こす孊生の䜜品もありたす (特に、「smart-env」ずいう名前は必芁な察策です)。

そしお、このリストは長期間続く可胜性がありたす。 しかし、䞊蚘の点は、䜕か䟿利で普遍的なものを䜜るずいうアむデアに興奮するのに十分でした。

Smart-env を䜜成する前に蚭定された芁件:

  • 最もシンプルな䜿甚スキヌム
  • 簡単に蚭定可胜なデヌタ型入力のサポヌト
  • Python2.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() の XNUMX ぀のメ゜ッドを䜿甚しお実珟されたす。 これは、環境倉数にシリアル化された JSON のようなオブゞェクト、たたは単なるブヌル定数が含たれおいる堎合に䟿利です (環境倉数を「有効な」文字列ず比范するこずによっお Django で DEBUG 倉数を明瀺的に蚭定するのが最も䞀般的なケヌスの XNUMX ぀です)。 しかし、珟圚は文字列を明瀺的に倉換する必芁はありたせん。必芁なアクションのほずんどはすでにラむブラリの奥深くに埋め蟌たれおおり、シグナルが動䜜するのを埅っおいるだけです。 🙂 䞀般に、入力は透過的に機胜し、利甚可胜なほがすべおの組み蟌みデヌタ型をサポヌトしたす (frozenset、complex、bytes はテストされおいたせん)。

Python 2 をサポヌトする芁件は、特にナビキタスな 3 ぀のおかげで (メタクラス䜿甚の問題を解決するため)、ほずんど犠牲 (タむピングの攟棄ず Python XNUMX の最新バヌゞョンの䞀郚の「砂糖菓子」) なしで実装されたした。 。

ただし、いく぀かの制限がありたす。

  • Python 3 のサポヌトずは、バヌゞョン 3.5 以降を意味したす (プロゞェクト内に Python 3.4 が存圚するのは、怠惰か改善の必芁性が欠劂しおいるためです。XNUMX がただ䜿甚されおいる客芳的な理由を思い぀くのは難しいためです)。
  • Python 2.7 では、ラむブラリはセット リテラルの逆シリアル化をサポヌトしたせん。 説明 ここで。 しかし、それを実装したい人がいたら、倧歓迎です :);

このラむブラリには、解析゚ラヌが発生した堎合の䟋倖メカニズムもありたす。 利甚可胜なアナラむザヌのいずれでも文字列を認識できなかった堎合、倀は文字列のたたになりたす (利䟿性ず、Bash での倉数の動䜜に関する通垞のロゞックずの䞋䜍互換性のため)。

Pythonシェルラむブラリ

次に、XNUMX 番目のラむブラリに぀いお説明したす (既存の類䌌䜓の欠点に぀いおの説明は省略したす。これは、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. 暙準出力のコマンドの出力ずその戻りコヌドにアクセスするこずができたす。
  6. コマンドがシステムにない堎合は、䟋倖がスロヌされたす。

Smart-env ず同様に、Python 2 はサポヌトされおいたすが (ただし、もう少し犠牲が必芁でした)、Python 3.0  3.4 はサポヌトされおいたせん。

図曞通敎備蚈画

これらのラむブラリは今すぐ䜿甚できたす。䞡方ずも公匏 PyPI に掲茉されおいたす。 ゜ヌスは Github で入手できたす (䞋蚘を参照)。

どちらのラむブラリも、関心のある人から収集したフィヌドバックを考慮しお開発されたす。 たた、smart-env でさたざたな新機胜を思い぀くのが難しい堎合は、python-shell で間違いなく他に远加できるものがありたす。

  • ノンブロッキング呌び出しのサポヌト。
  • チヌムずの察話型コミュニケヌションの可胜性 (暙準入力での䜜業)。
  • 新しいプロパティを远加したす (たずえば、stderr からの出力を受け取るプロパティ)。
  • 利甚可胜なコマンドのディレクトリの実装 (dir() 関数で䜿甚するため)。
  • 等

リファレンス

  1. スマヌト環境ラむブラリ: githubの О PyPI
  2. Pythonシェルラむブラリ: githubの О PyPI
  3. 電報チャンネル ラむブラリの曎新

UPD 23.02.2020
* リポゞトリが移動され、察応するリンクが曎新されたした
* バヌゞョン python-shell==1.0.1 は、29.02.2020 幎 XNUMX 月 XNUMX 日のリリヌスに向けお準備䞭です。 倉曎には、コマンドのオヌトコンプリヌトず dir(Shell) コマンドのサポヌト、無効な Python 識別子を䜿甚したコマンドの実行、バグ修正が含たれたす。

出所 habr.com

コメントを远加したす