[issue16587] Py_Initialize breaks wprintf on Windows

2012-11-30 Thread Markus Kettunen

New submission from Markus Kettunen:

In a C application on Windows, at least on MSVC 2010 and Windows 7, do this:

wprintf(L"Test\n");
Py_Initialize();
wprintf(L"Test\n");

Output is:
Test
 T e s t

I was able to track the issue to fileio.c to the following code block by 
searching where wprintf breaks:

if (dircheck(self, nameobj) < 0)
goto error;

#if defined(MS_WINDOWS) || defined(__CYGWIN__)
/* don't translate newlines (\r\n <=> \n) */
_setmode(self->fd, O_BINARY); <- breaks it
#endif

if (PyObject_SetAttrString((PyObject *)self, "name", nameobj) < 0)
goto error;

This can be easily confirmed by adding wprintfs on both sides of _setmode.

This issue was also raised at 
http://mail.python.org/pipermail/python-list/2012-February/620528.html but no 
solution was provided back then.

--
components: IO, Unicode, Windows
messages: 176732
nosy: ezio.melotti, makegho
priority: normal
severity: normal
status: open
title: Py_Initialize breaks wprintf on Windows
type: behavior
versions: Python 3.3

___
Python tracker 
<http://bugs.python.org/issue16587>
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue16587] Py_Initialize breaks wprintf on Windows

2012-11-30 Thread Markus Kettunen

Markus Kettunen added the comment:

If the standard streams are not used through Python, this hack can be used to 
work around the bug on C side:

#ifdef WIN32
#include 
#endif

...

Py_Initialize();

#ifdef WIN32
_setmode(stdin->_file, O_TEXT);
_setmode(stdout->_file, O_TEXT);
_setmode(stderr->_file, O_TEXT);
#endif

--

___
Python tracker 
<http://bugs.python.org/issue16587>
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue16587] Py_Initialize breaks wprintf on Windows

2014-06-23 Thread Markus Kettunen

Markus Kettunen added the comment:

It's quite common to use wide character strings to support Unicode in C and C++.

In C++ this often means using std::wstring and std::wcout. Maybe these are more 
common than wprintf? In any case the console output breaks as Py_Initialize 
hijacks the host application's standard output streams which sounds quite 
illegitimate to me.

I understand that Python isn't designed for embedding and it would be a lot of 
work to fix it, but I would still encourage everyone to take a look at this 
bug. For me, this was one of the reasons I ultimately had to decide against 
using Python as my application's scripting language, which is a shame.

--

___
Python tracker 
<http://bugs.python.org/issue16587>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue16587] Py_Initialize breaks wprintf on Windows

2014-06-23 Thread Markus Kettunen

Markus Kettunen added the comment:

> On Linux, std::wcout doesn't use wprintf(). Do you mean that std::wcout also 
> depends on the "mode" of stdout (_setmode)?

Yes, exactly. I originally noticed this bug by using std::wcout on Windows.

--

___
Python tracker 
<http://bugs.python.org/issue16587>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com