--- # このスライドは lookatme で動作します. # <https://github.com/d0c-s4vage/lookatme> # # 依存するライブラリをインストールします. # # ```shell # cat <<EOF | xargs pip install # marshmallow>=3.17.0,<4 # Click>=7,<9 # PyYAML==6.0.1 # mistune>=0.8,<1 # urwid==2.1.2 # Pygments>=2,<3 # EOF # ``` # # cf. # <https://github.com/d0c-s4vage/lookatme/issues/219#issuecomment-1772072003> # <https://github.com/d0c-s4vage/lookatme/issues/224#issuecomment-2308911806> # # lookatme を依存ライブラリ無しでインストールします. # # ```shell # pip install --no-deps lookatme==2.5.5 # ``` # # 開始します. # # ```shell # lookatme slide.md # ``` # title: 幸福な CLI 生活のための取るに足らない小さな話 author: なかだじゅんや date: 2024-01-24 --- # 幸福な CLI 生活のための取るに足らない小さな話 なかだじゅんや, 2024-01-24, Python駿河 勉強会 #40 --- ## お前誰よ? なかだじゅんや、と言います. Go で Software を書く仕事をしています. Python はあまり書きません. 標準ライブラリのドキュメントを読めばわかる小さな話をします. --- ## Shell の醍醐味 Pipe と Redirect ```shell $ echo 'Hello, world!' | cat - >hello.txt $ cat hello.txt Hello, world! ``` Python でもこんなコマンドが作れないか? --- ## One of solutions is argparse.FileType <https://docs.python.org/3/library/argparse.html#filetype-objects> --- ## Example ```python #!/usr/bin/env python3 import argparse import codecs if __name__ == "__main__": ap = argparse.ArgumentParser(description=__doc__) ap.add_argument("src", type=argparse.FileType(), help="source file") ap.add_argument( "dst", type=argparse.FileType(mode="w"), help="destination file" ) args = ap.parse_args() src = args.src.read() dst = codecs.encode(src, encoding="rot_13") args.dst.write(dst) ``` --- ## Help ```text usage: rot13.py [-h] src dst positional arguments: src source file dst destination file options: -h, --help show this help message and exit ``` --- ## 入力出力ともファイル名を与える ```shell $ cat hello.txt Hello, world! $ rm -f result.txt && touch $_ && cat $_ $ ./rot13.py hello.txt result.txt $ cat result.txt Uryyb, jbeyq! ``` --- ## 標準入力から与える ```shell $ rm -f result.txt && touch $_ && cat $_ $ cat hello.txt | ./rot13.py - result.txt $ cat result.txt Uryyb, jbeyq! ``` --- ## 標準入力から標準出力へ ```shell $ echo 'Hello, World!' | ./rot13.py - - Uryyb, Jbeyq! ``` --- ## 標準入力から標準出力を経由してファイルへ ```shell $ echo 'Hello, World!' | ./rot13.py - - >result.txt $ cat result.txt Uryyb, jbeyq! ``` --- ## たくさんつなげる ```shell $ echo 'Hello, World!' | ./rot13.py - - | ./rot13.py - - Hello, World! $ echo 'Hello, World!' | ./rot13.py - - | ./rot13.py - - | ./rot13.py - - Uryyb, jbeyq! ``` --- ## 注意点 * FileType で開いたファイルは, エラーが起こっても close されない. * FileType が - を解釈をしてくれるだけ. 引数に - を与える必要はある. cf. <https://docs.python.org/3/library/argparse.html#filetype-objects> --- ## おしまい argparse.FileType で標準入出力を使用するコマンドを書くことができる. <https://docs.python.org/3/library/argparse.html#filetype-objects>