why msvcrt.printf show the first char only?

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Sat Oct 15 04:21:04 EDT 2011


On 12 oct, 08:50, Nobody <nob... at nowhere.com> wrote:
> On Wed, 12 Oct 2011 04:18:25 -0700, install... at 189.cn wrote:
> > from ctypes import *
> > msvcrt = cdll.msvcrt
> > message_string = "Hello world!\n"
> > print(msvcrt.printf("Testing: %s", message_string))
>
> > when running in eclipse, the result is:
> > 1
> > T
>
> > when running in IDLE, then result is:
> > 1
>
> > why is that?
>
> Odd. I get 22 when running from IDLE.
>
> Also, when using the console, it actually prints the text. I suspect that
> stdout gets block-buffered when using an IDE. I can't see any way to get a
> reference to stdout, so you can't fflush() it.

Launch IDLE from the command line and you'll see the text output.

To the OP: I bet your Eclipse runs Python 2.x and IDLE is 3.x.

In Python 3.x, "Test..." is a Unicode string, internally represented
using two bytes per character. (In contrast, in Python 2.x, "Test..."
is a byte string, and u"Test..." is unicode). All ASCII characters
have a 0 as their second byte in its internal representation. printf
expects a byte string, and stops as soon as it sees the '\0' following
the 'T' in 'Testing'. Either use wprintf("Testing..."), or encode the
Unicode object into a byte string before calling:
printf("Testing...".encode(sys.stdout.encoding)), or tell ctypes about
the right parameter type:

printf = msvcrt.printf
printf.argtypes = [c_char_p]
printf("Testing\n")

--
Gabriel Genellina



More information about the Python-list mailing list