我有一个我想在IPython中运行的Python脚本。我想将输出重定向(写入)到文件,类似于:
python my_script.py > my_output.txt
我在IPython中运行脚本时如何执行此操作,例如execfile('my_script.py')
有一个older page描述了一个可以编写的函数来执行此操作,但我相信现在有一种内置的方法来执行此操作,我找不到。
答案 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.stdout
和sys.stderr
的hacky方式,但这真的不是一个很好的方法。实际上,如果你想控制输出来自python内部的位置,你需要实现某种日志和/或输出处理系统,你可以通过命令行或函数参数来配置,而不是使用print
语句。
答案 6 :(得分:-1)
似乎有很多代码.... 我的解决方案 redirect output of ipython script into a csv or text file like sqlplus spool 想知道有一种简单的方法,比如oracle sqlplus spool命令..?