3

Python 版本 = 2.7,Windows

你好,

我的 Python 脚本使用共享 C 库,我想重定向脚本的标准 IO 和文件中的共享 C 库,如下例所示(仅限于 stderr 流)

C共享库代码:

#include <stdio.h>

void my_print(void)
{
    fprintf(stderr, "This string isn't displayed\n");
}

Python 脚本:

import os, sys, ctypes

def test():
    parserDll = ctypes.CDLL("./titi.dll")           # my shared C library
    file_stderr_fds = os.open("./toto.txt", 777)    # file in which redirect the stderr
    saved_stderr_fds = os.dup(2)                    # Backup stderr
    os.dup2(file_stderr_fds, 2)                     # Redirect stderr to file
    print >> sys.stderr, "zozo"                     # Python test redirect for Python script --> Ok
    parserDll.my_print(None)                        # test for the shared C library --> KO

if __name__ == "__main__":
    test()

当我运行这个 Python 脚本时,我在 toto.txt 文件中读取了“zozo”(从 Python 脚本中显示),但没有从共享 C 库中读取。但是,如果我将 os.dup2() 注释掉,两个字符串都会显示在控制台中。为什么?Python 脚本和使用的共享 C 库的标准 IO 不一样吗?在这种情况下,如何将两者重定向到同一个文件?

4

1 回答 1

0

当我在 Linux 中运行您的示例时,它工作得很好。

最有可能的是,Windows 实际上并没有使用 POSIX 文件描述符来stdio实现它,因此不受您更改它们的影响。我不能说我确切地知道 Windows 是如何libc实现 POSIX 文件描述符的,但它可能只是 Windows 原生使用的任何 POSIX 兼容性函数的一些兼容层,并且stdio代码可能根本不使用它们。

无论如何,在我看来,在stdio. 我认为您可能应该使用FILE *C 函数可用于日志记录的显式变量,而是使用来自 Python 的显式调用来切换。

于 2012-12-23T03:17:31.780 回答