2012-07-25 6 views
5

Sto eseguendo Eclipse con PyDev e Python 3.2 su Windows Vista e stavo lavorando a un'esercitazione su Python e ctypes.Eclipse e Python 3: perché printf() da ctypes viene visualizzato nell'output della console dopo le successive istruzioni print()

Tuttavia, ho scoperto che quando chiamo msvcrt.printf() per stampare una stringa, questo non viene visualizzato nell'output della console per Eclipse finché non vengono visualizzate tutte le altre istruzioni di stampa.

Ecco il codice esatto che uso:

from ctypes import * 

msvcrt = cdll.msvcrt 
message_string = "Hello Worlds!\n" 

printf = msvcrt.printf 
print(printf("Testing: %s".encode('ascii'),message_string.encode('ascii'))) 


print("foo") 

print("why!?") 

e qui è l'output:

23 
foo 
why!? 
Testing: Hello Worlds! 

Le uniche spiegazioni che ho visto altrove (per C in generale) parlare di come printf è tamponata e ha bisogno di una nuova riga prima della visualizzazione, ma c'è una nuova riga nella stringa e ne ho aggiunta anche una direttamente alla dichiarazione printf ('printf ("Test:% s \ n", ...') e non ha fatto alcuna differenza.

Voglio lavorare in Eclipse, non voglio dover continuare ad aprire un prompt dei comandi ogni volta che voglio testare gli script, quindi c'è un modo per risolvere questo ordine nell'output della console? E perché succede questo?

risposta

0

Sebbene questo non risponda alla domanda, ma printf restituisce 23 che è il numero di caratteri stampati, è possibile sostituirlo con sprintf e che restituirà la stringa e verrà visualizzato nella console nell'ordine previsto corretto.

Tuttavia, non vedo un motivo per utilizzare mscvcrt's printf quando è possibile fare lo stesso con python.

+0

Stavo seguendo un tutorial su ctypes, che ho pianificare di utilizzare per funzioni diverse da printf in seguito. La ragione per cui volevo capire questo e farla funzionare è perché se non riesco a capire cosa sta succedendo con questo semplice compito, come posso aspettarmi di capire quelli più complessi? – Brian

1

Se la libreria standard C ritiene che stdout sia connesso a un file o una pipe anziché a una console, bloccherà il buffer dell'output. Si può ovviare a questo con l'emissione di un fflush dopo printf:

msvcrt.fflush(msvcrt.stdout) 

Si può anche essere in grado di forzare stdout in non-buffered mode:

msvcrt.setvbuf(msvcrt.stdout, None, _IONBF, 0) 
+0

Grazie per la spiegazione, ma per quanto riguarda le correzioni, ottengo questo errore: "AttributeError: function 'stdout' non trovato" – Brian

+0

Ottenere un puntatore a stdout da msvcrt potrebbe essere abbastanza difficile; vedi http://osdir.com/ml/python.ctypes/2005-09/msg00019.html – ecatmur

Problemi correlati