技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Python 3.x でのシェルとの共存

Python3.7.x で動作確認。
ちまちま記事を追加中。

github.com

シェルとの相互運用周りを行うサンプルです。

Python のシェルライク起動

Pythonpython コマンド引数でなく実行する方法です。
先頭に #!/usr/bin/python を突っ込んで実行権限を与えます。

#!/usr/bin/python
print('fire')

この状態で実行権限を付与して実行します。

$ chmod +x hello.py
$ ./hello.py
fire

パイプから呼び出す処理を作成する

パイプから呼び出される際、その値は標準入力から設定されます。
注意点として、ある程度まとまった結果を標準入力でまとめて受け流という点です。

サンプルとして simple.py を用意しました。

#!/usr/bin/python
import os
import sys

value = sys.stdin.read()  # パイプの入力
value = value.replace('//', '/')  # / が // として入力されるのでリプレース

splitted = value.split("\n")  # 改行で分解し
for line in splitted:
    if os.path.isfile(line):  # それがファイルで
        filename, ext = os.path.splitext(line)
        if '.txt' == ext:  # 拡張子が txt なら中身を表示します
            with open(line, mode='r') as rf:
                print(''.join(rf.readlines()))

そして実行してみる。
1行目はファイル構成。この値が標準入力に入ってきます。

$ find ./sampleTexts/
./sampleTexts/
./sampleTexts//dontcall.md
./sampleTexts//example.txt
$ 
$ chmod +x simple.py
$ find ./sampleTexts/ | ./simple.py 
Hello python: shell command.

Python からシェルコマンドを実行する

一番わかりやすいところで ls コマンドをサブプロセスとして呼んでみます。
shell_command.py というファイル名で作成してます。

#!/usr/local/bin/python3
import subprocess
proc = subprocess.run(["ls"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(proc.stdout.decode("utf8"))

単純にパイプを呼び出す

パイプを実行するもっともシンプルな方法。
simple_pipe.py として保存。

#!/usr/local/bin/python3
import subprocess

res = subprocess.check_output(
    "ls | grep si",
    shell=True,
    stderr=subprocess.STDOUT)

print(res.decode())

Python からパイプを実行してみる

といってもパイプのアウトプットを連結するだけです。
途中に Python 処理を挟みたければ挟めば?って用途ですね。

pipe_basic.py として用意します。

#!/usr/local/bin/python3
import subprocess

p1 = subprocess.Popen(["ls"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["grep", "py"], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()

result = p2.communicate()[0]
print(result.decode())