本シリーズのトップページ |
---|
https://qiita.com/robozushi10/items/fabde36bb9a312347bc7 |
はじめに
一般的に Python で Linux コマンドを使う場合は subprocess
を使うこと多い.
が、標準パッケージでは無いものの subprocess の代替である「sh
」(amoffat/sh
) も便利である.1
個人的な考えではあるが、「sh2」は標準パッケージでは無いので、職場などで使い込むと
他者の迷惑になり兼ねない。しかし、適度に使う分には subprocess
よりも速く実装できて
好都合なので書き残しておく.
本項では「「sh」で find コマンドする」を記す.
この実装方法であれば シェルスクリプトに近い感覚で実装できるので、
subprocess よりも速く実装できるのではないかと思う.
セットアップ
pip 等で sh
をインストールする.
詳細は本項末尾の「参考情報」に記した.
使用例
下記シェルスクリプト「003.sh」相当を、パッケージ「sh」を使って Python で実装する
003.sh
処理概要
$HOME/work/. から4階層下までを対象に、「.git/」が存在するディレクトリの絶対パスを得る
コード
#!/bin/bash
find $HOME/work -maxdepth 4 -type d -name ".git" | xargs -I@ realpath @
実行結果
/home/foo/work/wiki/02_software/xx/.git
/home/foo/work/wiki/02_software/git-lfs/.git
/home/foo/work/wiki/02_software/git-lfs2/.git
/home/foo/work/wiki/02_software/xx2/.git
/home/foo/work/LOCAL_GITLAB/fluentd/.git
/home/foo/work/fluentd/.git
003.py
上述のシェルスクリプトを、Python パッケージ「sh」を使って実装する.
ここでは sh.find を使うが、シェルスクリプトのように簡潔な記法になっており、
subprocess から置き換えるメリットがあるかと思われる.
コード
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys; sys.dont_write_bytecode = True
import os
import traceback
import sh
if __name__ == '__main__':
T = '{0}/work/'.format(os.environ['HOME'])
for d in sh.find(T, '-maxdepth', '4', '-type', 'd', '-name', '.git'):
try:
absp = os.path.abspath(d).rstrip()
print(absp)
except:
traceback.print_exc(file=sys.stdout)
実行結果
/home/foo/work/wiki/02_software/xx/.git
/home/foo/work/wiki/02_software/git-lfs/.git
/home/foo/work/wiki/02_software/git-lfs2/.git
/home/foo/work/wiki/02_software/xx2/.git
/home/foo/work/LOCAL_GITLAB/fluentd/.git
/home/foo/work/fluentd/.git
参考情報
項目 | 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 |
検討環境
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
以上