IPythonで実行したいPythonスクリプトがあります。次のように、出力をファイルにリダイレクト(書き込み)したいと思います。
python my_script.py > my_output.txt
IPythonでスクリプトを実行するときにこれを行うにはどうすればよいですか?execfile('my_script.py')
これを行うために書くことができる関数を説明している古いページがありますが、今では私が見つけることができないこれを行うための組み込みの方法があると思います。
IPythonで実行したいPythonスクリプトがあります。次のように、出力をファイルにリダイレクト(書き込み)したいと思います。
python my_script.py > my_output.txt
IPythonでスクリプトを実行するときにこれを行うにはどうすればよいですか?execfile('my_script.py')
これを行うために書くことができる関数を説明している古いページがありますが、今では私が見つけることができないこれを行うための組み込みの方法があると思います。
IPythonには、 stdout / errをキャプチャするための独自のコンテキストマネージャーがありますが、ファイルにリダイレクトせず、オブジェクトにリダイレクトします。
from IPython.utils import io
with io.capture_output() as captured:
%run my_script.py
print captured.stdout # prints stdout from your script
そして、この機能は、 Cell Magicsのサンプルノートブック%%capture
に示されているように、cell-magicで公開されています。
これは単純なコンテキストマネージャーなので、ファイルにリダイレクトする独自のバージョンを作成できます。
class redirect_output(object):
"""context manager for reditrecting stdout/err to files"""
def __init__(self, stdout='', stderr=''):
self.stdout = stdout
self.stderr = stderr
def __enter__(self):
self.sys_stdout = sys.stdout
self.sys_stderr = sys.stderr
if self.stdout:
sys.stdout = open(self.stdout, 'w')
if self.stderr:
if self.stderr == self.stdout:
sys.stderr = sys.stdout
else:
sys.stderr = open(self.stderr, 'w')
def __exit__(self, exc_type, exc_value, traceback):
sys.stdout = self.sys_stdout
sys.stderr = self.sys_stderr
これを使用して呼び出す:
with redirect_output("my_output.txt"):
%run my_script.py
IPythonでの作業中に変数に含まれるテキストをすばやく保存するには、または:を使用%store
します。>
>>
%store VARIABLE >>file.txt
(追加)
%store VARIABLE >file.txt
(上書き)
>
(またはの直後にスペースがないことを確認してください>>
)
これは古い質問ですが、同様の問題に直面していたので、これと答えを見つけました。
IPython Cellの魔法のドキュメントを調べた後に見つけた解決策は、実際にはかなり単純です。最も基本的な解決策は、コマンドの出力を変数に割り当てることです。
この単純な2セルの例は、その方法を示しています。最初のノートブックセルでは、セルマジックstdout
を利用するための出力を含むPythonスクリプトを定義します。%%writefile
%%writefile output.py
print("This is the output that is supposed to go to a file")
!
次に、演算子を使用してシェルから実行されたように、そのスクリプトを実行します。
output = !python output.py
print(output)
>>> ['This is the output that is supposed to go to a file']
次に、魔法を簡単に利用し%store
て出力を永続化できます。
%store output >output.log
ただし、コマンドの出力は行のリストとして保持されることに注意してください。"\n".join(output)
出力を保存する前に呼び出すことをお勧めします。
このコードを使用して、出力をファイルに保存します
import time
from threading import Thread
import sys
#write the stdout to file
def log():
#for stop the thread
global run
while (run):
try:
global out
text = str(sys.stdout.getvalue())
with open("out.txt", 'w') as f:
f.write(text)
finally:
time.sleep(1)
%%capture out
run = True
print("start")
process = Thread(target=log, args=[]).start()
# do some work
for i in range(10, 1000):
print(i)
time.sleep(1)
run= False
process.join()
トレーサーがファイルを変更し、 notepad++のようにファイルをリロードすることを提案するテキストエディターを使用すると便利です。
実行するスクリプトを1つだけにするために、bashでリダイレクトを実行します
ipython -c "execfile('my_script.py')" > my_output.txt
Python 3では、execfileはもう存在しないため、代わりにこれを使用してください
ipython -c "exec(open('my_script.py').read())" > my_output.txt
二重引用符と一重引用符に注意してください。
sys.stdout
上書きしてファイルオブジェクトを使用するというハッキーな方法がありますsys.stderr
が、それは実際には良い方法ではありません。print
実際、Python内からの出力の行き先を制御したい場合は、ステートメントを使用する代わりに、コマンドラインまたは関数の引数を介して構成できる、ある種のロギングおよび/または出力処理システムを実装する必要があります。
それはたくさんのコードのようです....私の解決策。 ipythonスクリプトの出力をsqlplusスプールのようなcsvまたはテキストファイルにリダイレクトします。oraclesqlplus スプールコマンドのような簡単な方法があるのではないでしょうか。