相关疑难解决方法(0)

如何制作一系列功能装饰器?

如何在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在一个真实的应用程序中这样做 - 只是试图了解装饰器和装饰器链是如何工作的.

python decorator python-decorators

2647
推荐指数
17
解决办法
49万
查看次数

将stdout重定向到Python中的文件?

如何将stdout重定向到Python中的任意文件?

当从ssh会话中启动长时间运行的Python脚本(例如,Web应用程序)并进行后台处理,并且ssh会话关闭时,应用程序将引发IOError并在尝试写入stdout时失败.我需要找到一种方法来将应用程序和模块输出到文件而不是stdout,以防止由于IOError导致的失败.目前,我使用nohup将输出重定向到一个文件,这就完成了工作,但是我想知道是否有办法在不使用nohup的情况下完成它,出于好奇.

我已经尝试了sys.stdout = open('somefile', 'w'),但这似乎并没有阻止一些外部模块仍然输出到终端(或者sys.stdout = ...线路根本没有发射).我知道它应该使用我测试过的简单脚本,但我还没有时间在Web应用程序上进行测试.

python stdout

285
推荐指数
8
解决办法
43万
查看次数

在Python中使函数的stdout静音而不会破坏sys.stdout并恢复每个函数调用

有没有办法让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)

这种方式有效,但似乎非常低效.有是一个更好的办法.有任何想法吗?

python stdout

46
推荐指数
6
解决办法
4万
查看次数

在python中,如何将stdout从c ++共享库捕获到变量

由于某些其他原因,我使用的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()打印"你好",它的工作原理!

我的问题是:

  1. 如何将c ++共享库的stdout捕获到变量
  2. 为什么使用StringIO,无法捕获共享库的输出?

c++ python

18
推荐指数
3
解决办法
7908
查看次数

OpenCV Python:如何检测窗口是否关闭?

我有以下代码:

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)

那么它做了什么:

  1. 打开一个窗口
  2. 在循环中,在窗口上显示图像
  3. 完成后,关闭窗口
  4. 运行其余代码

但是在这种情况下,我有total_frame之前给出的.我不希望这样.

相反,我想要一个执行以下操作的代码:

  1. 打开一个窗口
  2. 在循环中,在窗口上显示图像
  3. 等待用户关闭该窗口
  4. 当用户关闭该窗口时,退出循环,继续执行其余代码.

但是,我在OpenCV中找不到可以检测用户何时关闭窗口的函数.有人可以建议一个解决方法吗?

python opencv

13
推荐指数
3
解决办法
2万
查看次数

从python重定向stdout进行C调用

这是从一个跟进的问题在这里专门涉及了答案.


从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.

问题

  1. 上面的函数究竟发生了什么?
    • 是什么dupdup2做什么?
    • 什么是/dev/null
    • 第8行在做什么?(sys.stdout = os.fdopen(newstdout, 'w'))
  2. 如何将stdout存储在StringIO对象中?
  3. 如何在调用Hello World程序后恢复标准输出?

我很确定,一旦我得到了问题1的答案,问题2和3的答案就很容易了.无论如何我决定发布它们可能会将问题1的答案推到我想去的方向.

python stdout io-redirection dup2 dup

9
推荐指数
2
解决办法
3869
查看次数

带有ctypes的stdout重定向

我正在尝试将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)

python windows ctypes

9
推荐指数
1
解决办法
2824
查看次数

python:从函数内部的`print`获取输出

我正在使用一些函数库,其中一些函数可以打印我需要的数据:

def func():
   print "data"
Run Code Online (Sandbox Code Playgroud)

如何调用此函数并将打印数据转换为字符串?

python python-2.7

8
推荐指数
1
解决办法
2649
查看次数

如何从ctypes C函数获取打印输出到Jupyter/IPython笔记本?

介绍

假设我有这个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

然后我将它导入JupyterIPython笔记本中运行的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)

python ctypes jupyter jupyter-notebook

7
推荐指数
1
解决办法
1786
查看次数

抑制模块外部库调用的输出

使用机器学习库PyML时,我遇到了一个恼人的问题.PyML使用libsvm来训练SVM分类器.问题是libsvm将一些文本输出到标准输出.但因为那是在Python之外我不能拦截它.我尝试使用问题中描述的方法在Python中静默函数的标准输出,而不会破坏sys.stdout并恢复每个函数调用,但这些都没有帮助.

有什么方法可以做到这一点.修改PyML不是一种选择.

python libsvm pyml

6
推荐指数
2
解决办法
3418
查看次数

在 Python 中从 OpenCV 调用时静默 h264 解码警告

我有以下脚本,我使用 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 logging opencv ffmpeg h.264

5
推荐指数
0
解决办法
2812
查看次数

使用 python 包装器和/或 pyvista 时是否可以静默本机 VTK 日志?

目前,我们使用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 日志记录模块抑制或管理这些日志?

vtk pyvista

3
推荐指数
1
解决办法
495
查看次数

如何使用`with` 语句来抑制`sys.stdout` 或`sys.stderr`?

我正在尝试使用with声明来抑制sys.stdoutsys.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)

python stdout suppress stderr dev-null

0
推荐指数
1
解决办法
1172
查看次数