2017-11-30 4 views
2

Ich folgte einige der Antworten in Python ctypes: Python file object <-> C FILE * und ich habe ein Problem festgestellt. Der folgende Code:Wie bekomme ich den entsprechenden ctype für stdout auf OS X mit Libc.dylib

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

Funktioniert ohne Fehler auf meiner virtuellen Maschine mit Ubuntu. Jedoch wenn ich versuche, die gleiche Sache auf meinem MacbookPro laufen HighSierra zu tun, das heißt:

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

bekomme ich folgende Fehlermeldung:

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

Ich habe versucht, dies mit python2.7 und python3.5. Mit beiden bekomme ich keine Fehler auf Ubuntu und den zuvor erwähnten Fehler auf OS X HighSierra.

Der Grund, warum ich das brauche, ist, weil ich einen Python-Wrapper für ein Cipi kodiere, und in diesem CAPI gibt es eine Funktion, die FILE * als Eingabeargument erwartet, also möchte ich stdout übergeben.

Jede Hilfe wäre willkommen!

p.s. Ich möchte mich dafür entschuldigen, dass ich einen neuen Beitrag geschrieben habe, anstatt mich im bestehenden zu äußern, aber ich bin ein neuer Benutzer mit nur 35 Ruf im Moment und ich darf nicht kommentieren, bis ich mindestens 50 Ruf bekomme.

Antwort

0

Vom stdio.h Header auf macOS:

#define stdout __stdoutp

daher Ihr Python-Code sollte diese stattdessen tun:

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

Ich hoffe, dass die Antwort hilfreich war.

Verwandte Themen