---
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>