私はコンソールの出力をライブとして保存しながらpythonスクリプトを実行する関数を作成したいと思います。コンソールからライブ出力を保存しているときにpythonスクリプトを実行するにはどうすればいいですか?
たとえば、サブプロセスモジュールを使用してexample.pyを実行しますが、コンソール出力が発生したときにコンソール出力を受け取る代わりに、スクリプト全体が実行された後にのみコンソール出力が表示されます。言い換えれば、以下のスクリプトに従って、すぐにコンソール出力「hello world」を受け取ってから60秒待ってからコンソール出力「さようなら」を受け取ってください。
example.py
以下import time
print "hello world!"
time.sleep(60)
print "goodbye world"
はexample.pyでスクリプトを実行し、これは全体のスクリプトが実行された後の文字列として、以下を返す
import subprocess
script = open('example.py',"r+").read()
process = subprocess.Popen(['python', '-'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process.stdin.write(script)
stored_console_output, stored_console_output_error = process.communicate()
print stored_console_output
後コンソールを格納するスクリプトである
hello world!
goodbye world
注:pythonスクリプトexample.pyを変更することはできません。私はそれを呼び出す関数を変更することしかできません。
コンソール出力をライブ(できるだけ)にすることに加えて、そのコンソール出力につながったpythonの行を取得したいと思います。例えば、私はまたのsysモジュールを利用することを試みたが、それはコンソール出力が格納されていない以下の
import time
print "hello world!"
hello world
time.sleep(60)
print "goodbye world"
goodbye world
達成したいと思います:
import sys
import inspect
class SetTrace(object):
def __init__(self, func):
self.func = func
def __enter__(self):
sys.settrace(self.func)
return self
def __exit__(self, ext_type, exc_value, traceback):
sys.settrace(None)
def monitor(frame, event, arg):
if event == "line":
print event
return monitor
with SetTrace(monitor):
exec(open('example.py',"r+").read())
これは以下を返しますし、それは生きている。
line
line
line
hello world!
line
line
goodbye world
line