--- type: slide title: 幸福な CLI 生活のための取るに足らない小さな話 author: なかだじゅんや date: YYYY年MM月dd日 --- # 幸福な CLI 生活のための取るに足らない小さな話 お前誰よ? なかだじゅんや、と言います. 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> 2024-01-24, Python駿河 勉強会 #40 Slide 生成に使用した Software. <https://github.com/maaslalani/slides>