如何使用 libc.dylib 在 OS X 上获取标准输出的相应 ctype

How to get the corresponding ctype for stdout on OS X using libc.dylib

我在关注 Python ctypes: Python file object <-> C FILE * 中的一些答案时遇到了问题。以下代码:

from ctypes import *
libc = CDLL('libc.so.6')
cstdout = c_void_p.in_dll(libc, 'stdout')

在我的虚拟机上正常工作 运行 Ubuntu。然而,当我尝试在我的 MacbookPro 运行 HighSierra 上做同样的事情时,即:

from ctypes import *
libc = CDLL('libc.dylib')
cstdout = c_void_p.in_dll(libc, 'stdout')

我收到以下错误:

Traceback (most recent call last):
   File "<stdin>", line 3, in <module>
ValueError: dlsym(0x7fff6bfc4728, stdout): symbol not found

我尝试使用 python2.7 和 python3.5。对于它们,我在 Ubuntu 上没有错误,在 OS X HighSierra 上没有出现前面提到的错误。

我需要这个的原因是因为我正在为 C api 编写一个 Python 包装器,并且在那个 C api 中有一个函数期望 FILE* 作为一个输入参数,所以我想将标准输出传递给它。

如有任何帮助,我们将不胜感激!

p.s。我很抱歉写了一个新的 post,而不是在现有的评论中,但我是一个新用户,目前只有 35 个声誉,在我至少获得 50 个声誉之前我不能发表评论.

来自 macOS 上的 stdio.h header:

#define stdout __stdoutp

因此您的 python 代码应该这样做:

cstdout = c_void_p.in_dll(libc, '__stdoutp')

希望回答对您有所帮助。