当前位置: 首页 > 面试题库 >

从python重定向stdout进行C调用

党源
2023-03-14
问题内容

从python模块中,我正在调用 Hello World 可执行文件,该文件仅打印Hello World到stdout。我对将输出重定向到pythonStringIO并遇到这个答案很感兴趣,这几乎将我带到了解决方案中。

此答案的关键部分是以下代码段:

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')

我也想恢复重定向之前的标准输出。

问题

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

我很确定,一旦获得问题1的答案,问题2和3的答案就会很容易。我决定无论如何都要发布它们,以将问题1的答案推向我想去的方向。


问题答案:

我在下面写了一些附加的注释,这些注释应该更清楚redirect_stdout函数内部的情况:

def redirect_stdout():
    print "Redirecting stdout"
    sys.stdout.flush() # <--- important when redirecting to files

    # Duplicate stdout (file descriptor 1)
    # to a different file descriptor number
    newstdout = os.dup(1)

    # /dev/null is used just to discard what is being printed
    devnull = os.open('/dev/null', os.O_WRONLY)

    # Duplicate the file descriptor for /dev/null
    # and overwrite the value for stdout (file descriptor 1)
    os.dup2(devnull, 1)

    # Close devnull after duplication (no longer needed)
    os.close(devnull)

    # Use the original stdout to still be able
    # to print to stdout within python
    sys.stdout = os.fdopen(newstdout, 'w')

需要注意的重要一件事是,进程在启动时会从OS获取三个不同的文件描述符:

  • 标准输入:0
  • 标准输出:1
  • 标准错误:2

如评论中所述,上面的代码利用了stdout的文件描述符和文件描述符复制功能来欺骗C代码使用不同的stdout,同时仍保留对python代码中原始stdout的引用。打印。



 类似资料:
  • 我这里有一个非常奇怪的用例,我正试图为我的学生编写一些简单的程序,帮助他们学习python。为了让它工作,我在TKinter框架中嵌入了一个PyGame窗口,我需要重定向stdout以更改PyGame窗口中的某些内容。我有重定向工作,如果我重定向到一个文件,它的工作很好,但如果我试图改变文本,它不工作。我将一个字符串硬编码到PyGame文本更改代码中,这是可行的,但由于某些原因,它无法与重定向文本

  • 问题内容: 注意 我已经看到了multiprocessing.Process的日志输出-不幸的是,它没有回答这个问题。 我正在通过多重处理创建一个子进程(在Windows上)。我希望 所有 子进程的stdout和stderr输出都重定向到日志文件,而不是出现在控制台上。我看到的唯一建议是让子进程将sys.stdout设置为文件。但是,由于Windows上stdout重定向的行为,这不能有效地重定向

  • 问题内容: 我想从Groovy程序中执行foo.bat,并将生成的进程的输出重定向到stdout。Java或Groovy代码示例都可以。 foo.bat可能需要花费几分钟才能运行并生成大量输出,因此我希望在生成后立即查看输出,而不是必须等到该过程完成之后才能立即查看所有输出。 问题答案: 它使用一个类读取执行的程序生成的所有输出,并将其显示在其自己的stdout中。

  • 问题内容: 我在cyberciti.biz的评论中看到了这个有趣的问题。 我发现我什至找不到在sh的单行命令中执行此操作的灵活方法。 到目前为止,我对解决方案的想法是: 但是您会看到,这不是同步的,而且致命的是,它是如此丑陋。 欢迎与您分享这个想法。:) 问题答案: 你要 这里的顺序很重要。假设stdin(fd 0),stdout(fd 1)和stderr(fd 2)最初都连接到tty,因此 首先

  • 问题内容: 如何在Python中将stdout重定向到任意文件? 当从ssh会话中启动运行了很长时间的Python脚本(例如,Web应用程序)并进行背景调整,并且ssh会话关闭时,该应用程序将在尝试写入stdout时引发并失败。我需要找到一种方法来使应用程序和模块输出到文件而不是stdout,以防止由于而导致失败。当前,我使用将输出重定向到文件,并且可以完成工作,但是我想知道是否有一种出于好奇而无

  • 问题内容: 在shell中,您可以执行重定向 等操作,但是启动程序后如何呢? 这就是我问这个问题的方式,在我的终端后台运行的程序不断输出令人讨厌的文本。这是一个重要的过程,因此我必须打开另一个shell以避免输入文本。我希望能够进行重定向或其他重定向,以便可以继续在同一外壳中工作。 问题答案: 除非关闭并重新打开您的tty(即注销并重新登录,这可能还会终止该过程中的某些后台进程),否则您只剩下一个