私はインタプリタの入力とエラーと標準出力の両方にリアルタイムでアクセスしたいと思います。できれば、この情報はファイルに書き込まれるので、すべてのインタプリタコマンドが入力された後にファイルをポーリングすることができます。私は、ログファイルに以下を見てみたいと思いますPythonの対話型シェルセッションで発生するすべてをログに記録する方法は?
>>> 5 * 7
35
>>> print("Hello, world!")
Hello, world!
>>> "Hello, world!"
'Hello, world!'
:たとえば、インタプリタセッションを与え
> 5 * 7
35
> print("Hello, world!")
Hello, world!
> "Hello, world!"
'Hello, world!'
フォーマットは重要ではありません。重要なことは、セッション中に対話的なイベントを引き起こすキーワードをファイルから検索できることです。
:Pythonのcode
モジュールは私がInteractiveConsole
オブジェクト、私はそうのように、ファイルにログを記録するように再定義することができたのraw_input
メソッドを作成することができます:私はこれを達成しようと、これまでに学んだこと
def write(self, data):
sys.stderr.write(data)
self.file.write(data+'\n')
:
InteractiveConsole
内蔵私は再定義することができ、エラーをログに記録する
write
メソッドを使用しています
import code
class LoggedConsole(code.InteractiveConsole):
def __init__(self, locals):
super(LoggedConsole, self).__init__(locals)
self.file = open('consolelog.dat', 'a')
def __del__(self):
self.file.close()
def raw_input(self, prompt=""):
data = input(prompt)
self.file.write(data+'\n')
return data
さらに
、すべて一緒に、その後LoggedConsole
オブジェクトを作成することでしたこれを持参し、地元の人々にそれをTee
を渡す
class Tee(object):
def __init__(self):
self.file = open('consolelog.dat', 'a')
self.stdout = sys.stdout
def __del__(self):
sys.stdout = self.stdout
self.file.close()
def write(self, data):
self.file.write(data)
self.stdout.write(data)
sys.stdout = Tee()
マイ(壊れた)の試行:
は、私はまた、次のコードは、すべての標準出力をログに記録することを学びました。
console = LoggedConsole(locals={sys.stdout:LoggedExec()})
console.interact()
(私は前に地元の人々に合格していませんでしたので、おそらく私は間違ってここでそれをやっているが、私はエラーが表示されません。)
とにかく、これは、新しいインタラクティブコンソールを開きます。すべての入力とエラーを記録し(終了後に)記録しますが、出力は記録しません。私はしばらくこのことに頭をぶつけていました。私は近くにいるように感じますが、たぶん、そうではないかもしれません。
また、このすべてが発生する方法はありますか?セッション中ですか?セッションが終了すると、現在すべてのロギングが行われます。
あなたのお時間をありがとうございます、テキストの壁には申し訳ありません。
編集: 私は移植性のために標準のPythonインタプリタでこれを達成したいと考えています。
edit2: Jaimeのスニペットは、必要なすべてのログを記録するのに非常に有効です。しかし、セッションを閉じるのを待つのではなく、リアルタイムでそうすることができます。
edit3: それを実証しました:)。最終的に、作業スニペット:
import code
import sys
class Tee(object):
def __init__(self, log_fname, mode='a'):
self.log = open(log_fname, mode)
def __del__(self):
# Restore sin, so, se
sys.stdout = sys.__stdout__
sys.stdir = sys.__stdin__
sys.stderr = sys.__stderr__
self.log.close()
def write(self, data):
self.log.write(data)
self.log.flush()
sys.__stdout__.write(data)
sys.__stdout__.flush()
def readline(self):
s = sys.__stdin__.readline()
sys.__stdin__.flush()
self.log.write(s)
self.log.flush()
return s
def flush(foo):
return
sys.stdout = sys.stderr = sys.stdin = Tee('consolelog.dat', 'w')
console = code.InteractiveConsole()
console.interact()
あなたのユースケースは分かりませんが、 'ipython notebook'はインタラクティブなワークフローには大変優れています。 – Kos