如何在Python中创建两个装饰器来执行以下操作?
@makebold
@makeitalic
def say():
return "Hello"
Run Code Online (Sandbox Code Playgroud)
...应该返回:
"<b><i>Hello</i></b>"
Run Code Online (Sandbox Code Playgroud)
我不是试图HTML在一个真实的应用程序中这样做 - 只是试图了解装饰器和装饰器链是如何工作的.
如何将stdout重定向到Python中的任意文件?
当从ssh会话中启动长时间运行的Python脚本(例如,Web应用程序)并进行后台处理,并且ssh会话关闭时,应用程序将引发IOError并在尝试写入stdout时失败.我需要找到一种方法来将应用程序和模块输出到文件而不是stdout,以防止由于IOError导致的失败.目前,我使用nohup将输出重定向到一个文件,这就完成了工作,但是我想知道是否有办法在不使用nohup的情况下完成它,出于好奇.
我已经尝试了sys.stdout = open('somefile', 'w'),但这似乎并没有阻止一些外部模块仍然输出到终端(或者sys.stdout = ...线路根本没有发射).我知道它应该使用我测试过的简单脚本,但我还没有时间在Web应用程序上进行测试.
有没有办法让Python在没有包含像下面这样的函数调用的情况下使stdout静音?
原始破码:
from sys import stdout
from copy import copy
save_stdout = copy(stdout)
stdout = open('trash','w')
foo()
stdout = save_stdout
Run Code Online (Sandbox Code Playgroud)
编辑:更正了Alex Martelli的代码
import sys
save_stdout = sys.stdout
sys.stdout = open('trash', 'w')
foo()
sys.stdout = save_stdout
Run Code Online (Sandbox Code Playgroud)
这种方式有效,但似乎非常低效.有有是一个更好的办法.有任何想法吗?
由于某些其他原因,我使用的c ++共享库将一些文本输出到标准输出.在python中,我想捕获输出并保存到变量.关于重定向标准输出有许多类似的问题,但在我的代码中不起作用.
示例:禁止在库外调用模块的输出
1 import sys
2 import cStringIO
3 save_stdout = sys.stdout
4 sys.stdout = cStringIO.StringIO()
5 func()
6 sys.stdout = save_stdout
Run Code Online (Sandbox Code Playgroud)
在第5行,func()将调用共享库,共享库生成的文本仍然输出到控制台!如果改变func()打印"你好",它的工作原理!
我的问题是:
我有以下代码:
total_frames = 50
cv2.cv.NamedWindow("Dragonfly Simulation")
cv2.cv.StartWindowThread()
for i in range(total_frames):
# do stuff
img_name = # something
img = cv2.cv.LoadImage(img_name)
cv2.cv.ShowImage("Dragonfly Simulation", img)
cv2.cv.WaitKey(2)
cv2.cv.DestroyWindow("Dragonfly Simulation")
cv2.cv.WaitKey(1)
# rest of code
Run Code Online (Sandbox Code Playgroud)
那么它做了什么:
但是在这种情况下,我有total_frame之前给出的.我不希望这样.
相反,我想要一个执行以下操作的代码:
但是,我在OpenCV中找不到可以检测用户何时关闭窗口的函数.有人可以建议一个解决方法吗?
从python模块我调用一个Hello World可执行文件,只是打印Hello World到stdout.我有兴趣将该输出重定向到python StringIO并遇到这个答案,这几乎让我一直到解决方案.
这个答案的关键部分是这段代码:
1. def redirect_stdout():
2. print "Redirecting stdout"
3. sys.stdout.flush() # <--- important when redirecting to files
4. newstdout = os.dup(1)
5. devnull = os.open('/dev/null', os.O_WRONLY)
6. os.dup2(devnull, 1)
7. os.close(devnull)
8. sys.stdout = os.fdopen(newstdout, 'w')
Run Code Online (Sandbox Code Playgroud)
此外,我想恢复重定向之前的stdout.
dup和dup2做什么?/dev/null?sys.stdout = os.fdopen(newstdout, 'w'))StringIO对象中?我很确定,一旦我得到了问题1的答案,问题2和3的答案就很容易了.无论如何我决定发布它们可能会将问题1的答案推到我想去的方向.
我正在尝试将printf函数的输出重定向到Windows上的文件.我正在使用python3的ctypes来调用函数.我的代码是:
import os, sys
from ctypes import *
if __name__ == '__main__':
print("begin")
saved_stdout=os.dup(1)
test_file=open("TEST.TXT", "w")
os.dup2(test_file.fileno(), 1)
test_file.close()
print("python print")
cdll.msvcrt.printf(b"Printf function 1\n")
cdll.msvcrt.printf(b"Printf function 2\n")
cdll.msvcrt.printf(b"Printf function 3\n")
os.dup2(saved_stdout, 1)
print("end")
Run Code Online (Sandbox Code Playgroud)
但是当我从Eclipse运行代码时,我在屏幕上得到以下内容:
begin
end
Printf function 1
Printf function 2
Printf function 3
Run Code Online (Sandbox Code Playgroud)
...以及TEST.txt中的以下内容
python print
Run Code Online (Sandbox Code Playgroud)
当我从cmd运行它时,这就是屏幕上的内容:
begin
end
Run Code Online (Sandbox Code Playgroud)
..这是在TEST.txt中:
python print
Run Code Online (Sandbox Code Playgroud)
当我评论出第二个dup2()陈述时,例如
import os, sys
from ctypes import *
if __name__ == '__main__':
print("begin")
saved_stdout=os.dup(1)
test_file=open("TEST.TXT", "w")
os.dup2(test_file.fileno(), 1)
test_file.close()
print("python print")
cdll.msvcrt.printf(b"Printf function 1\n") …Run Code Online (Sandbox Code Playgroud) 我正在使用一些函数库,其中一些函数可以打印我需要的数据:
def func():
print "data"
Run Code Online (Sandbox Code Playgroud)
如何调用此函数并将打印数据转换为字符串?
假设我有这个C代码:
#include <stdio.h>
// Of course, these functions are simplified for the purposes of this question.
// The actual functions are more complex and may receive additional arguments.
void printout() {
puts("Hello");
}
void printhere(FILE* f) {
fputs("Hello\n", f);
}
Run Code Online (Sandbox Code Playgroud)
我正在编译为共享对象(DLL): gcc -Wall -std=c99 -fPIC -shared example.c -o example.so
然后我将它导入到在Jupyter或IPython笔记本中运行的Python 3.x中:
import ctypes
example = ctypes.cdll.LoadLibrary('./example.so')
printout = example.printout
printout.argtypes = ()
printout.restype = None
printhere = example.printhere
printhere.argtypes = (ctypes.c_void_p) …Run Code Online (Sandbox Code Playgroud) 使用机器学习库PyML时,我遇到了一个恼人的问题.PyML使用libsvm来训练SVM分类器.问题是libsvm将一些文本输出到标准输出.但因为那是在Python之外我不能拦截它.我尝试使用问题中描述的方法在Python中静默函数的标准输出,而不会破坏sys.stdout并恢复每个函数调用,但这些都没有帮助.
有什么方法可以做到这一点.修改PyML不是一种选择.
我有以下脚本,我使用 OpenCV 从 Python3 读取 RTSP 流。
cap = cv2.VideoCapture(ID)
ret, frame = cap.read()
这些流使用 h264 进行编码,我收到大量警告和错误消息。
[h264 @ 0x7f74cc430c80] co located POCs unavailable
[h264 @ 0x7f74b4258160] error while decoding MB 38 2, bytestream -19
我尝试使用上下文管理器来重定向 stdout 和 stderr 让它们保持沉默,但没有成功:
class SilenceOutput(object):
def __enter__(self):
self._original_stdout = sys.stdout
self._original_stderr = sys.stderr
sys.stdout = None
sys.stderr = None
def __exit__(self, exc_type, exc_val, exc_tb):
sys.stdout = self._original_stdout
sys.stderr = self._original_stderr
Run Code Online (Sandbox Code Playgroud) 目前,我们使用Python的vtk包装器和Pyvista(一个更Pythonist的vtk包装器)。
在该过程的某些部分,我们有一些来自 .cxx 文件的日志行:
2022-03-17 17:21:56.031 ( 156.058s) [ 4CC78740] vtkDelaunay3D.cxx:518 WARN| vtkDelaunay3D (0x559d2b180400): 1 degenerate triangles encountered, mesh quality suspect
2022-03-17 17:21:58.045 ( 158.072s) [ 4CC78740] vtkMath.cxx:522 WARN| Unable to factor linear system
2022-03-17 17:21:58.288 ( 158.314s) [ 4CC78740] vtkDelaunay3D.cxx:518 WARN| vtkDelaunay3D (0x559d0877c080): 3 degenerate triangles encountered, mesh quality suspect
Run Code Online (Sandbox Code Playgroud)
是否可以从 python 日志记录模块抑制或管理这些日志?
我正在尝试使用with声明来抑制sys.stdout或sys.stderr单独使用。 我发现了一个不起作用的教程。我正在使用Python 3.6.4并且我认为该教程是Python 2.
我在 SO 上查了一下,发现了一些但应用程序不起作用或不适用于这种情况。
这不适用:Python subprocess supress stdout and stderr
无法使任何with语句起作用:
Suppress stdout / stderr print from Python functions
这适用于 fortran:在 Python 中重定向 FORTRAN(通过 F2PY 调用)输出
from contextlib import contextmanager
@contextmanager
def suppress_console(file=sys.stdout):
with open(os.devnull, "w") as devnull:
old_file = file
file = devnull
try:
yield
finally:
file = old_file
with suppress_console():
print(1, file=sys.stdout)
# 1
Run Code Online (Sandbox Code Playgroud)