2009-11-17 4 views
2

J'essaie de connecter tous la sortie d'un programme écrit en Python et C. Toutefois, l'impression à partir de Python provoque IOError: [Errno 9] Bad file descriptorPython, C: feux de stdout [Errno 9]

S'il vous plaît, personne ne sait quel est le problème et comment le réparer?

PS: Il est sous Windows XP, Python 2.6 et MinGW GCC

#include <windows.h> 
#include <fcntl.h> 
#include "Python.h" 

int main() 
{ 
    int fds[2]; 
    _pipe(fds, 1024, O_BINARY); 
    _dup2(fds[1], 1); 
    setvbuf(stdout, NULL, _IONBF, 0); 

/* alternative version: */ 
// HANDLE hReadPipe, hWritePipe; 
// int fd; 
// DWORD nr; 
// CreatePipe(&hReadPipe, &hWritePipe, NULL, 0); 
// fd = _open_osfhandle((intptr_t)hWritePipe, _O_BINARY); 
// _dup2(fd, 1); 
// setvbuf(stdout, NULL, _IONBF, 0); 

    write(1, "write\n", 6); 
    printf("printf\n"); 
    Py_Initialize(); 
    PyRun_SimpleString("print 'print'"); // this breaks 
    Py_Finalize(); 

    char buffer[1024]; 
    fprintf(stderr, "buffer size: %d\n", read(fds[0], buffer, 1024)); // should always be more than 0 

/* alternative version: */ 
// CloseHandle(hWritePipe); 
// char buffer[1024]; 
// ReadFile(hReadPipe, buffer, 1024, &nr, NULL); 
// fprintf(stderr, "buffer size: %d\n", nr); // should always be more than 0 
} 

+0

Avez-vous créé Python vous-même ou essayez-vous d'utiliser des binaires précompilés? –

+0

prebuild, à partir de python.org – EcirH

Répondre

2

Je pense qu'il pourrait être de faire avec différents runtimes C. Je sais que vous ne pouvez pas passer des descripteurs de fichiers entre des runtimes C différents - Python est construit avec MSVC (vous devrez vérifier quelle version) - donc vous pouvez essayer de construire MinGW avec le même runtime C - je pense qu'il y a des options à faire ceci dans MinGW comme -lmsvcrt80 (ou selon les versions appropriées) mais pour des raisons de licence, ils ne peuvent pas distribuer les bibliothèques de sorte que vous devrez les trouver sur votre système. Désolé, je n'ai pas plus de détails à ce sujet pour l'instant, mais j'espère que c'est un début pour googler.

Un moyen plus simple serait de tout faire en Python ... il suffit de créer une classe qui expose une méthode write et peut-être flush et l'assigner à sys.stdout. Par exemple pour un fichier, vous pouvez simplement passer un objet fichier ouvert - il est probablement tout à fait normal de faire une chose similaire pour votre pipe. Ensuite, il suffit de l'importer et sys et de définir sys.stdout dans un PyRun_SimpleString.

+0

Merci pour la réponse! Je suis désolé, je ne suis pas sûr que je suis tout à fait la chose avec différents temps d'exécution ... J'ai essayé: gcc -o std.exe std.c -Ic: /dev/include/python2.6 -l python26 -l msvcr90 mais alors il se bloque avec "L'application n'a pas réussi à s'initialiser correctement (0x80000003)." En outre, je n'ai pas MSVC - cela pourrait-il être? Que j'ai besoin de msvcrt.lib de VC2008 (IIRC c'était utilisé pour Python 2.6)? Dans MinGW j'ai plusieurs libmsvc * .a ... – EcirH

+0

Il est plus impliqué que ça de lier avec ça avec mingw mais j'ai peur de ne pas avoir plus de détails. Il pourrait être plus facile d'utiliser le même compilateur Microsoft que Python utilisé (je pense que Visual Studio 2008). – robince

+0

Ou créez Python vous-même avec MinGW - mais aucune idée à quel point ce serait facile. – robince