2009-11-17 2 views
2
내가 파이썬과 C로 작성된 프로그램의 모든 출력을 로그온을 시도

그러나, 파이썬에서 인쇄하는 사람은 문제가 무엇인지 알 수 있을까, IOError: [Errno 9] Bad file descriptor파이썬, C : 리디렉션 표준 출력 화재 [errno를 9]

제발 원인 그것을 고치는 방법?

PS : 그것은 내가 다른 C 런타임과 함께 할 수 있다고 생각 윈도우 XP, 파이썬 2.6는 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

파이썬을 직접 만들 었는지 또는 사전 빌드 된 바이너리를 사용하려고 했습니까? –

+0

prebuild 것들, from python.org – EcirH

답변

2

에 있습니다. 다른 C 런타임 사이에 파일 설명자를 전달할 수 없다는 것을 알고 있습니다. Python은 MSVC (어떤 버전인지 확인해야합니다)로 작성되었으므로 동일한 C 런타임에 대해 MinGW를 만들 수 있습니다. - 할 수있는 옵션이 있다고 생각합니다. 이것은 MinGW에서 -lmsvcrt80 (또는 적절한 버전)과 유사하지만 라이센싱을 이유로 라이브러리를 배포 할 수 없기 때문에 시스템에서 찾을 필요가 있습니다. 죄송합니다. 지금은 더 이상 세부 정보가 없지만 잘하면 검색을 시작합니다.

더 간단한 방법은 파이썬에서 모두 수행하는 것입니다 ... write 및 아마도 flush 메서드를 노출하고 sys.stdout에 할당하는 클래스를 만듭니다. 예를 들어 열린 파일 객체를 전달할 수있는 파일의 경우, 파이프에 대해 비슷한 작업을 수행하는 것은 직설적입니다. 그런 다음 sys와 sys.stdout을 PyRun_SimpleString에 설정하면됩니다.

+0

답장을 보내 주셔서 감사합니다! 죄송합니다. 다른 런타임으로 문제를 해결할 수 있는지 잘 모르겠습니다 ... 시도 : 시도 : gcc -o std.exe std.c -Ic : /dev/include/python2.6 -l python26 -l msvcr90 그러나 "응용 프로그램을 제대로 초기화하지 못했습니다 (0x80000003)."와 충돌합니다. 또한 MSVC가 없습니다. 이럴 수 있습니까? VC2008에서 msvcrt.lib가 필요합니다 (IIRC는 파이썬 2.6에서 사용되었습니다)? MinGW에는 여러 libmsvc * .a ... – EcirH

+0

그것은 mingw와 연결하는 것보다 더 복잡하지만 더 자세한 내용은 없습니다. 파이썬이 사용했던 것과 동일한 마이크로 소프트 컴파일러를 사용하는 것이 가장 쉽습니다 (Visual Studio 2008라고 생각합니다). – robince

+0

아니면 MinGW로 직접 파이썬을 빌드하십시오. – robince