IPython:将Python脚本的输出重定向到文件(如bash>)

时间:2013-01-28 20:56:46

标签: python io ipython

我有一个我想在IPython中运行的Python脚本。我想将输出重定向(写入)到文件,类似于:

python my_script.py > my_output.txt

我在IPython中运行脚本时如何执行此操作,例如execfile('my_script.py')

有一个older page描述了一个可以编写的函数来执行此操作,但我相信现在有一种内置的方法来执行此操作,我找不到。

7 个答案:

答案 0 :(得分:39)

IPython有capturing 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

此功能以%%capture单元格魔法公开,如Cell Magics example notebook所示。

这是一个简单的上下文管理器,因此您可以编写自己的版本来重定向到文件:

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

答案 1 :(得分:11)

编写一个脚本对我来说似乎有些过分,因为我只是想在IPython中工作时看到变量中包含的大量文本。这对我有用:

ÿþ(追加)
%store VARIABLE >> file.txt(覆盖)

答案 2 :(得分:1)

尽管这是一个老问题,但我遇到类似问题时却找到了这个问题和答案。

经过IPython Cell magics documentation筛选后,我发现的解决方案实际上非常简单。最基本的解决方案是将命令的输出分配给变量。

这个简单的两格示例显示了如何执行此操作。在第一个Notebook单元中,我们使用# ~~~~ TODO: not working.单元魔术来定义Python脚本并向stdout进行一些输出。

%%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 ,然后再存储输出。

答案 3 :(得分: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++

答案 4 :(得分:0)

仅运行一个脚本,我将在bash中进行重定向

ipython -c "execfile('my_script.py')" > my_output.txt

python 3 上,execfile不再存在,因此请改用它

ipython -c "exec(open('my_script.py').read())" > my_output.txt

小心双引号和单引号。

答案 5 :(得分:-1)

有一种用文件对象覆盖sys.stdoutsys.stderr的hacky方式,但这真的不是一个很好的方法。实际上,如果你想控制输出来自python内部的位置,你需要实现某种日志和/或输出处理系统,你可以通过命令行或函数参数来配置,而不是使用print语句。

答案 6 :(得分:-1)

似乎有很多代码.... 我的解决方案 redirect output of ipython script into a csv or text file like sqlplus spool 想知道有一种简单的方法,比如oracle sqlplus spool命令..?