2017-08-05 1 views
2

私はコンソールの出力をライブとして保存しながら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 

答えて

0

This postあなたの特定の問題への鍵を提供し、特にone commentがありますが、大部分は、あなたの質問に答える:sleep()にSTDOUTバッファリングを防ぐためにexample.pyを呼び出すとき、あなたは-uフラグを必要としています。上記の答えから多額の借入

、このソリューションは動作します:

from subprocess import Popen, PIPE 

def execute(cmd): 
    popen = Popen(cmd, stdout=PIPE, universal_newlines=True) 
    for stdout_line in iter(popen.stdout.readline, ""): 
     yield stdout_line 
    popen.stdout.close() 

for statement in execute(['python', '-u', 'example.py']): 
    print(statement, end="") 

出力:

Hello 
# pauses for the number of sleep seconds 
Goodbye 
関連する問題