本シリーズのトップページ |
---|
https://qiita.com/robozushi10/items/fabde36bb9a312347bc7 |
はじめに
一般的に Python で Linux コマンドを使う場合は subprocess
を使うこと多い.
が、標準パッケージでは無いものの subprocess の代替である「sh
」(amoffat/sh
) も便利である.1
個人的な考えではあるが、「sh2」は標準パッケージでは無いので、職場などで使い込むと
他者の迷惑になり兼ねない。しかし、適度に使う分には subprocess
よりも速く実装できて
好都合なので書き残しておく.
ここでは Git Contrib という機能を使って Git 操作を実現 する例を記す.
(ただし、Read Only 系の操作に絞る)
なお、ほとんど理解できていないが、Git が Contrib という名称で CLI を提供しており、
どうやら「sh」がこの Contrib を使えるようである.
この実装方法であれば シェルスクリプトに近い感覚で実装できるので、
subprocess や GitPython よりも速く実装できるのではないかと思う.3
セットアップ
pip 等で sh
をインストールする.
詳細は本項末尾の「参考情報」に記した.
使用例
ここでは次の Git操作の実装例を記す.
・git remote -v
・git branch -a
・git log --since '2021/08/01' --until '2021/08/05'
なお、公式ドキュメント を参考にすること.
git remote -v
もしも「unicode().decode('utf-8', 'ignore') raising UnicodeEncodeError ...」が
発生した場合は、後述の「UnicodeEncodeError 対策」を参照すること.
import sh
from sh.contrib import git
if __name__ == '__main__':
for line in git.remote('-v'):
print(line.rstrip())
git branch -a
もしも「unicode().decode('utf-8', 'ignore') raising UnicodeEncodeError ...」が
発生した場合は、後述の「UnicodeEncodeError 対策」を参照すること.
import sh
from sh.contrib import git
if __name__ == '__main__':
for line in git.branch('-a'):
print(line.rstrip())
git log --since '2021/08/01' --until '2021/08/05'
ログ精査などに便利である.
もしも「unicode().decode('utf-8', 'ignore') raising UnicodeEncodeError ...」が
発生した場合は、後述の「UnicodeEncodeError 対策」を参照すること.
import sh
from sh.contrib import git
if __name__ == '__main__':
for line in git.log('--since', '2021/08/01','--until', '2021/08/05'):
print(line.rstrip())
補足
UnicodeEncodeError 対策
次の一文を追加してやれば良い.
for line in git.log('--since', '2021/08/05','--until', '2021/08/06'):
+ line = line if not isinstance(line, bytes) else line.decode('utf-8', "ignore")
print(line.rstrip())
参考情報
項目 | URL | 一言 |
---|---|---|
Pypi sh | https://pypi.org/project/sh/ | |
公式ドキュメント - トップページ | https://amoffat.github.io/sh/ | |
公式ドキュメント - API逆引き | https://amoffat.github.io/sh/reference.html | |
チュートリアル | https://amoffat.github.io/sh/tutorials | ここで実現したい機能を検索しながら使うことが多い |
もた日記 | https://wonderwall.hatenablog.com/entry/2017/07/30/083000 | |
git contribを使う | https://qiita.com/soranoba/items/eef8fdf4334394e52c92 |
検討環境
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
以上