Re: Redirect stdout to a buffer [Errno 9]
I tried to replace official Python dll with the one built with MinGW and it works. The problem is, that port is very old and so far it seems that official support for building Python under MinGW is nowhere near. I really don't want to use MSVC, so if there's any other way around this, please, let me know. -- http://mail.python.org/mailman/listinfo/python-list
Re: Redirect stdout to a buffer [Errno 9]
On Nov 17, 6:51 am, Gabriel Genellina gagsl-...@yahoo.com.ar wrote: The code below now reads from the pipe everything that has been written -- except from Python :( Thanks a lot for the fine code! So far I don't know why it fails to print from Python - I'll post here any news I get... -- http://mail.python.org/mailman/listinfo/python-list
Re: Redirect stdout to a buffer [Errno 9]
On Nov 15, 5:28 pm, Ecir Hana ecir.h...@gmail.com wrote: Hello, I'm trying to write a simple Win32 app, which may run some Python scripts. Since it is a Windows GUI app, I would like to redirect all output (Python print, C printf, fprinf stderr, ...) to a text area inside the app. In other words, I'm trying to log all the output from the app (C, Python) to a window. So far, this works for C printf(): int fds[2]; _pipe(fds, 1024, O_TEXT); _dup2(fds[1], 1); ... and then I read from pipe's read-end and append the text to the text area. But when I try to run: Py_Initialize(); PyRun_SimpleString(print 'abc'); Py_Finalize(); I get an error: IOError: [Errno 9] Bad file descriptor What am I doing wrong? How to redirect standard IO, both for C and for Python? PS: Maybe I'm doind something wrong, but SetStdHandle() does not work at all Also, maybe this matters: it's on WinXP, Python 2.6 and MinGW GCC. -- http://mail.python.org/mailman/listinfo/python-list
Re: Redirect stdout to a buffer [Errno 9]
En Mon, 16 Nov 2009 14:17:52 -0300, Ecir Hana ecir.h...@gmail.com escribió: I'm trying to write a simple Win32 app, which may run some Python scripts. Since it is a Windows GUI app, I would like to redirect all output (Python print, C printf, fprinf stderr, ...) to a text area inside the app. In other words, I'm trying to log all the output from the app (C, Python) to a window. So far, this works for C printf(): [...] PS: Maybe I'm doind something wrong, but SetStdHandle() does not work at all This worked for me: #include windows.h #include Python.h int main() { HANDLE hReadPipe, hWritePipe; DWORD nr, nw; char buffer[100]; CreatePipe( hReadPipe, hWritePipe, NULL, 1024); SetStdHandle(STD_OUTPUT_HANDLE, hWritePipe); Py_Initialize(); PyRun_SimpleString(print 'from Python'); Py_Finalize(); puts(from C\n); CloseHandle(hWritePipe); ReadFile(hReadPipe, buffer, 19, nr, NULL); CloseHandle(hReadPipe); WriteFile(GetStdHandle(STD_ERROR_HANDLE), buffer, nr, nw, NULL); } Also, maybe this matters: it's on WinXP, Python 2.6 and MinGW GCC. I'm using Visual Studio 2008 Express Edition. -- Gabriel Genellina -- http://mail.python.org/mailman/listinfo/python-list
Re: Redirect stdout to a buffer [Errno 9]
On Nov 16, 7:21 pm, Gabriel Genellina gagsl-...@yahoo.com.ar wrote: En Mon, 16 Nov 2009 14:17:52 -0300, Ecir Hana ecir.h...@gmail.com escribió: I'm trying to write a simple Win32 app, which may run some Python scripts. Since it is a Windows GUI app, I would like to redirect all output (Python print, C printf, fprinf stderr, ...) to a text area inside the app. In other words, I'm trying to log all the output from the app (C, Python) to a window. So far, this works for C printf(): [...] PS: Maybe I'm doind something wrong, but SetStdHandle() does not work at all This worked for me: #include windows.h #include Python.h int main() { HANDLE hReadPipe, hWritePipe; DWORD nr, nw; char buffer[100]; CreatePipe( hReadPipe, hWritePipe, NULL, 1024); SetStdHandle(STD_OUTPUT_HANDLE, hWritePipe); Py_Initialize(); PyRun_SimpleString(print 'from Python'); Py_Finalize(); puts(from C\n); CloseHandle(hWritePipe); ReadFile(hReadPipe, buffer, 19, nr, NULL); CloseHandle(hReadPipe); WriteFile(GetStdHandle(STD_ERROR_HANDLE), buffer, nr, nw, NULL); } Also, maybe this matters: it's on WinXP, Python 2.6 and MinGW GCC. I'm using Visual Studio 2008 Express Edition. -- Gabriel Genellina Hi, thanks for the reply! However, please, could you tell me how many bytes it read here: ReadFile(hReadPipe, buffer, 19, nr, NULL); because for me, it has read 0. When I run your code, it prints from both C and Python, but it prints straight to the console, not to the buffer. Could you also please try to add: WriteFile(GetStdHandle(STD_ERROR_HANDLE), \n, 5, nw, NULL); before: WriteFile(GetStdHandle(STD_ERROR_HANDLE), buffer, nr, nw, NULL); Does it print before from Python and from C for you? Because for me it comes afterwards (as nr is 0)... -- http://mail.python.org/mailman/listinfo/python-list
Re: Redirect stdout to a buffer [Errno 9]
En Mon, 16 Nov 2009 18:04:21 -0300, Ecir Hana ecir.h...@gmail.com escribió: On Nov 16, 7:21 pm, Gabriel Genellina gagsl-...@yahoo.com.ar wrote: En Mon, 16 Nov 2009 14:17:52 -0300, Ecir Hana ecir.h...@gmail.com escribió: I'm trying to write a simple Win32 app, which may run some Python scripts. Since it is a Windows GUI app, I would like to redirect all output (Python print, C printf, fprinf stderr, ...) to a text area inside the app. In other words, I'm trying to log all the output from the app (C, Python) to a window. So far, this works for C printf(): [...] thanks for the reply! Sorry, my earlier code was not working as I expected; I wrongly assumed the output was being redirected but that was not the case. The version below (set paranoid mode on) does redirect printf(), fwrite(stdout,...), write(1,...), WriteFile(consolehandle,...), all those calls in C, but fails in Python with IOError: [Errno 9] Bad file descriptor. I'm unable to figure out *where* it fails just by reading the Python source; one should set a breakpoint in python26.dll to see what actually happens. However, please, could you tell me how many bytes it read here: ReadFile(hReadPipe, buffer, 19, nr, NULL); The code below now reads from the pipe everything that has been written -- except from Python :( code #include windows.h #include stdio.h #include fcntl.h #include Python.h int error(char* lpszText) { LPVOID lpMsgBuf; DWORD lasterror = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, lasterror, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) lpMsgBuf, 0, NULL ); fprintf(stderr, %s: error %d: %s, lpszText, lasterror, lpMsgBuf); LocalFree(lpMsgBuf); return 1; } int main() { HANDLE hReadPipe, hWritePipe; DWORD nr, nw; char buffer[100]; int fd, i; BOOL bResult; if (!CreatePipe( hReadPipe, hWritePipe, NULL, 0)) return error(cannot create pipe); if (!SetStdHandle(STD_OUTPUT_HANDLE, hWritePipe)) return error(SetStdHandle); // this was missing in previous version fd = _open_osfhandle((intptr_t)hWritePipe, _O_TEXT); if (fd==-1) return error(_open_osfhandle); if (_dup2(fd, 1)!=0) return error(dup2); if (!WriteFile(hWritePipe, WriteFile(pipe)\n, 16, nr, NULL)) return error(WriteFile(pipe)); if (!WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), WriteFile(stdout)\n, 18, nr, NULL)) return error(WriteFile(stdout)); fputs(fputs from C\n, stdout); if (fwrite(fwrite from C\n, 1, 14, stdout)!=14) return error(fwrite!=14); if (write(1, write from C\n, 13)0) return error(write); fflush(stdout); fprintf(stderr, before Python\n); Py_Initialize(); PyRun_SimpleString(import sys;sys.stdout.write('from Python\\n')\n); Py_Finalize(); fprintf(stderr, before flush 2\n); fflush(stdout); fprintf(stderr, before close pipe w\n); if (!CloseHandle(hWritePipe)) return error(CloseHandle(hWritePipe)); fprintf(stderr, before close STDOUT Handle\n); if (!CloseHandle(GetStdHandle(STD_OUTPUT_HANDLE))) return error(CloseHandle(STDOUT)); fprintf(stderr, before read pipe\n); // read one char at a time... for (i = 0; isizeof(buffer); i++) { bResult = ReadFile(hReadPipe, buffer[i], 1, nr, NULL); if ((!bResult) || (nr==0)) break; } buffer[i]='\0'; fprintf(stderr, before close pipe r\n); if (!CloseHandle(hReadPipe)) return error(CloseHandle(hReadPipe)); fprintf(stderr, ==\nnread=%d\n%s\n, i, buffer); return 0; } /code -- Gabriel Genellina -- http://mail.python.org/mailman/listinfo/python-list