40

IPythonで実行したいPythonスクリプトがあります。次のように、出力をファイルにリダイレクト(書き込み)したいと思います。

python my_script.py > my_output.txt

IPythonでスクリプトを実行するときにこれを行うにはどうすればよいですか?execfile('my_script.py')

これを行うために書くことができる関数を説明している古いページがありますが、今では私が見つけることができないこれを行うための組み込みの方法があると思います。

4

7 に答える 7

45

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
于 2013-01-28T23:53:11.483 に答える
14

IPythonでの作業中に変数に含まれるテキストをすばやく保存するには、または:を使用%storeします。>>>

%store VARIABLE >>file.txt (追加)
%store VARIABLE >file.txt(上書き)

>(またはの直後にスペースがないことを確認してください>>

于 2017-05-17T16:59:42.000 に答える
2

これは古い質問ですが、同様の問題に直面していたので、これと答えを見つけました。

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)出力を保存する前に呼び出すことをお勧めします。

于 2019-08-09T06:03:02.777 に答える
1

このコードを使用して、出力をファイルに保存します

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++のようにファイルをリロードすることを提案するテキストエディターを使用すると便利です。

于 2020-01-02T19:48:00.443 に答える
0

実行するスクリプトを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

二重引用符と一重引用符に注意してください。

于 2020-06-17T10:16:27.117 に答える
-1

sys.stdout上書きしてファイルオブジェクトを使用するというハッキーな方法がありますsys.stderrが、それは実際には良い方法ではありません。print実際、Python内からの出力の行き先を制御したい場合は、ステートメントを使用する代わりに、コマンドラインまたは関数の引数を介して構成できる、ある種のロギングおよび/または出力処理システムを実装する必要があります。

于 2013-01-28T21:00:50.347 に答える
-1

それはたくさんのコードのようです....私の解決策。 ipythonスクリプトの出力をsqlplusスプールのようなcsvまたはテキストファイルにリダイレクトします。oraclesqlplus スプールコマンドのような簡単な方法があるのではないでしょうか。

于 2016-10-14T17:19:59.980 に答える