如何将stdout重定向到Python中的任意文件?
当从ssh会话中启动长时间运行的Python脚本(例如,Web应用程序)并进行后台处理,并且ssh会话关闭时,应用程序将引发IOError并在尝试写入stdout时失败.我需要找到一种方法来将应用程序和模块输出到文件而不是stdout,以防止由于IOError导致的失败.目前,我使用nohup将输出重定向到一个文件,这就完成了工作,但是我想知道是否有办法在不使用nohup的情况下完成它,出于好奇.
我已经尝试了sys.stdout = open('somefile', 'w'),但这似乎并没有阻止一些外部模块仍然输出到终端(或者sys.stdout = ...线路根本没有发射).我知道它应该使用我测试过的简单脚本,但我还没有时间在Web应用程序上进行测试.
我是一名蟒蛇.在这些日子里,我正在驾驶自己对我项目中的一些核心模块进行更完整的单元测试.由于我们总是使用方法'assertEqual','assertTrue'等进行单元测试,所以这些方法都需要来自被测函数的返回值,我想知道如何在没有返回值的情况下对某些函数进行普通单元测试.
我想在这里展示一个小例子,如何在HelloTest中测试函数def foo(self,msg)?
class HelloTest(object):
def foo(self, msg):
MSG = msg.upper()
self.bar(MSG)
def bar(self, MSG):
print MSG
Run Code Online (Sandbox Code Playgroud) 有没有办法在dis.dis()没有重定向的情况下获得输出sys.stdout?我试过了:
out=str(dis.dis())
Run Code Online (Sandbox Code Playgroud)
和
out=""""""
out+=str(dis.dis())
Run Code Online (Sandbox Code Playgroud)
但是我很快发现它又回来了None.有没有什么办法解决这一问题?
我正在使用一些函数库,其中一些函数可以打印我需要的数据:
def func():
print "data"
Run Code Online (Sandbox Code Playgroud)
如何调用此函数并将打印数据转换为字符串?
我想知道这是否可能在python中.
# module1
def test():
print('hey')
# module2
import module1
module1.test() # prints to stdout
Run Code Online (Sandbox Code Playgroud)
谢谢!
我想将输出写入文件,因此我做到了
sys.stdout = open(outfile, 'w+')
Run Code Online (Sandbox Code Playgroud)
但是后来我想在写入文件后打印回控制台
sys.stdout.close()
sys.stdout = None
Run Code Online (Sandbox Code Playgroud)
我得到了
AttributeError: 'NoneType' object has no attribute 'write'
Run Code Online (Sandbox Code Playgroud)
显然默认输出流不能是None,那么我该怎么对 Python 说:
sys.stdout = use_the_default_one()
Run Code Online (Sandbox Code Playgroud) 我在python中有一个函数,可以在标准输出中输出内容
def foo():
print("some text")
Run Code Online (Sandbox Code Playgroud)
我想将此函数中正在打印的文本"重定向"为变量,即"包装"此函数或其他任何内容,以便将文本存储在变量中:
text = wrapper(foo)
Run Code Online (Sandbox Code Playgroud)
有没有一种强大的方法来临时更改sys.stdout或打开变量作为一个FileObject或其他什么?
我有一个函数可以将一些随机字符串打印到控制台,例如:
from random import choice
def hello():
print(f"Hello {choice(('Guido', 'Raymond'))}!")
Run Code Online (Sandbox Code Playgroud)
请注意,我的实际功能比这更复杂。随机部分是对数据库的请求,可能成功也可能失败。这意味着我无法初始化种子以获得恒定的结果。
我尝试的是使用省略号,但我还需要添加一个丑陋的注释,以便 doctest 识别它。
def hello():
"""
>>> hello() # doctest: +ELLIPSIS
Hello ...!
"""
print(f"Hello {choice(('Guido', 'Raymond'))}!")
Run Code Online (Sandbox Code Playgroud)
在这种情况下有更好的策略吗?
例如,如果我可以测试答案是否为Hello Guido!和之间的一个,而不是省略号,那就太好了Hello Raymond!。
如果我有一个包含大量打印语句的函数:
即.
def funA():
print "Hi"
print "There"
print "Friend"
print "!"
Run Code Online (Sandbox Code Playgroud)
我想做的是这样的事情
def main():
##funA() does not print to screen here
a = getPrint(funA()) ##where getPrint is some made up function/object
print a ##prints what funA would normally print at this step
Run Code Online (Sandbox Code Playgroud)
因此,当调用funcA时,它不会进行任何打印,而是输出到对象.然后我打印对象以获得结果.有办法做到这一点吗?我也不想触摸原来的功能.
我希望这是有道理的.
我正在尝试将导入的另一个模块的函数的打印输出存储为字符串并将其写入文件.但是,该函数不返回字符串,只打印输出.所以我需要这样的东西:
import someModule
......
f.open('test.v','w')
out = storetheprintoutputasstring(someModule.main())
f.write(out)
f.close
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?请帮帮我,并提前感谢你
这就是我想要实现的目标
def fun():
runner = InteractiveConsole()
while(True):
code = raw_input()
code.rstrip('\n')
# I want to achieve the following
# By default the output and error of the 'code' is sent to STDOUT and STDERR
# I want to obtain the output in two variables out and err
out,err = runner.push(code)
到目前为止我所看到的所有解决方案都使用管道来发出单独的脚本执行命令(在我的情况下这是不可能的).我可以通过其他方式实现这一目标吗
不确定我将如何完成覆盖 print('something') 函数,并在我所在的类中做其他事情。
例如,我有以下代码:
import app
from app.helper import ws_send
class TemplateSubJob:
def __init__(self, sessiondata, sid, payload):
self.session = sessiondata
self.sid = sid
self.payload = payload
def startme(self):
ws_send(self.sid, self.payload, 'Send some output to the user...')
ws_send(self.sid, self.payload, 'Send something else to the user...')
print('test')
return b'xlsx_bytes_output'
Run Code Online (Sandbox Code Playgroud)
我想重写函数 print('something') 以获取传递的内容并用它做一些事情。
就我而言,我想创建一个打印函数来完成 ws_send() 正在做的事情,除了只接受一个字符串。
像下面这样:
def print(string):
ws_send(self.sid, self.payload, string)
print('now i am being sent through ws_send instead of stdout')
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
更新:
这样做的原因是,任何向我的函数添加代码的人都不需要修改他们的代码或脚本来使用我的函数。我可以劫持他们已经在使用的打印功能。
我在Django中创建了一个自定义命令,其中将一些输出输出到stdout。如何截取stdout进行一些更改(例如添加前缀)并写入stderr?这是测试任务,因此不要关注问题的不逻辑性。
python ×13
stdout ×4
python-2.7 ×2
python-3.x ×2
django ×1
doctest ×1
function ×1
printing ×1
unit-testing ×1