gpt4 book ai didi

python - 有没有一种跨平台的方法可以可靠地找到带有 ctypes 的 stdout 文件描述符?

转载 作者:太空狗 更新时间:2023-10-30 00:57:20 25 4
gpt4 key购买 nike

我有一些代码使用 ctypes 来尝试确定 sys.stdout 指向的文件是否实际上 stdout。我知道在任何符合 POSIX 的系统上,甚至在 Windows 上,如果 sys.stdout.fileno() == 1 可以安全地假设这是真的,所以我的问题不是如何一般情况下这样做。

在我的代码中(已经使用 ctypes 来处理与我的问题无关的事情)我不小心有类似的东西:

libc = ctypes.CDLL(ctypes.util.find_library('c'))
real_stdout = libc.fileno(ctypes.c_void_p.in_dll(libc, 'stdout'))
if sys.stdout.fileno() == real_stdout:
...

这在 Linux 上运行得非常好,所以我并没有考虑太多。与将 1 硬编码为文件描述符相比,它看起来更漂亮、更易读。但几天后我发现我的代码无法在 OSX 上运行。

事实证明 OSX 的 libc 不导出任何称为“stdout”的符号。相反,它的 stdio.h 将 stdout 定义为:

#define stdout __stdoutp

如果我将我的代码更改为 c_void_p.in_dll(libc, '__stdoutp') 我的代码会按预期工作,但当然这仅限于 OSX。事实证明,Windows 也有类似的问题(至少在使用 MSVC 时是这样)。

我可能只是更改我的代码以使用 1,但出于好奇,我的问题仍然存在,如果有一种跨平台的方式来获取 stdio 指针(还有 stdinstderr)而不假设它使用的是符合 POSIX 的描述符?

最佳答案

当涉及到 C 时,如果您想要兼容性,就必须去查看相关标准。既然你提到了 Windows,我想你实际上并不是想要 POSIX 标准,而是 C 标准。

C99 第 7、19、1 节将 stdout 定义为宏,因此不是变量。这意味着您无法依靠使用 dlsym(我假设 in_dll 使用)来找到它。实际表达式也可以是函数调用或固定地址。也许不太可能,但有可能……

如评论中所述,fileno 函数由 POSIX 而不是 C 定义。C 没有文件描述符的概念。我认为您最好假设 POSIX 并只检查它指定的值 1。

关于python - 有没有一种跨平台的方法可以可靠地找到带有 ctypes 的 stdout 文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9119371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com