diffの結果をpythonで取りたい
pythonでdiffを実行したいときがありました。
具体的には監視しているファイルの差分のさらっと取りたいとき。
- diffの結果をpythonで取る
- その結果をメールとかチャットとかのbodyに埋め込む
まぁ全部shellでやってもいいんですが、その前にいろんなことをしたい場合、やっぱりpythonとかのほうが便利です。
そんな時に便利なのが、subprocessのcheck_output。diffは差分が発生するとexit 1で、check_outputはnot 0のとき例外を投げます。
で、例外の属性に、returncodeとoutputが入っているので、それを拾えばOKです。
サンプル
subprocess_sample.py
# -*- coding: utf-8 -*-
import subprocess
import shlex
import sys
file1 = sys.argv[1]
file2 = sys.argv[2]
command_line = "diff -u {} {}".format(file1, file2)
command_args = shlex.split(command_line)
rc = 0
try:
rc = subprocess.check_output(command_args)
except subprocess.CalledProcessError as cpe:
print "shell returncode is not 0."
print "returncode: {}".format(cpe.returncode)
print "output: {}".format(cpe.output)
rc = cpe.returncode
print rc
% python subprocess_sample.py hoge_old.txt hoge_new.txt
shell returncode is not 0.
returncode: 1
output: --- hoge_old.txt 2015-06-27 14:29:03.000000000 +0900
+++ hoge_new.txt 2015-06-27 14:28:54.000000000 +0900
@@ -1,2 +1,2 @@
-hoge
+hogo
foo
1
かつてはcommandsモジュールがあったのですが、これは3系では廃止され、2系(2.7以降)でも非推奨です。