Warning: Invalid argument supplied for foreach() in /home/xs642990/dark-pla.net/public_html/wp-content/plugins/bravo-neo/bravo-neo.php(12) : eval()'d code on line 647
Pythonのプログラムを走らせるときの標準出力の出力先として、コマンドラインとファイルを同時に選ぶためのTipsです。
ニーズはバッチがうまく走らなかったプログラムをリアルタイムで確認したかったところから。
自分の所有物件の周辺の賃貸付状況を確認するために、Suumoで周辺のエリアの募集情報をごそっと抜き出すプログラムを夜間バッチで走らせているのですが、時折エラーで終了していることがありました。
夜間バッチでの経緯は、そのプログラムでは標準出力をテキストファイルに吐き出させているのでそれを確認すれば良いのですが、デバッグの作業でそのプログラムをリアルタイムで走らせているときには、実行が終わるまで状況を確認できない、ということがありました。
通常だとprint文での出力をコマンドライン上にするかファイルにするかの択一になってしまうという難点があるのですね。
で、両方同時に吐き出すような仕様にできないかな、ということでそういうプログラムを組んでみた、というわけです。
大元のプログラムはこんな感じです。
def job_rent_suumo():
logfile = CE.downfolder + 'suumo.txt'
sys.stdout = CE.Logger(logfile)
print("賃貸:処理開始")
dwn_suumo()
print("賃貸:処理完了")
def job_rent_suumo():
logfile = CE.downfolder + 'suumo.txt'
sys.stdout = CE.Logger(logfile)
print("賃貸:処理開始")
dwn_suumo()
print("賃貸:処理完了")
def job_rent_suumo(): logfile = CE.downfolder + 'suumo.txt' sys.stdout = CE.Logger(logfile) print("賃貸:処理開始") dwn_suumo() print("賃貸:処理完了")
stdoutの吐き出し先としてLoggerというclassにしています。
そしてそのLoggerの中身はこんな感じです。
class Logger:
def __init__(self, filename):
self.console = sys.stdout
self.file = open(filename, 'w')
def write(self, message):
self.console.write(message)
self.file.write(message)
def flush(self):
self.console.flush()
self.file.flush()
class Logger:
def __init__(self, filename):
self.console = sys.stdout
self.file = open(filename, 'w')
def write(self, message):
self.console.write(message)
self.file.write(message)
def flush(self):
self.console.flush()
self.file.flush()
class Logger: def __init__(self, filename): self.console = sys.stdout self.file = open(filename, 'w') def write(self, message): self.console.write(message) self.file.write(message) def flush(self): self.console.flush() self.file.flush()
これで、ファイルもコマンドラインも標準出力の出し先となりました。