2015-06-30 10 views
12

Betrachten Sie die folgende MWE:Wohin geht mein eingebetteter Python-Standard?

#include <Python.h> 
#include <stdio.h> 

int main(void) { 
    printf("Test 1\n"); 
    Py_Initialize(); 
    printf("Test 2\n"); 
    PyRun_SimpleString("print('Test 3')"); 
    printf("Test 4\n"); 
    return 0; 
} 

Wenn ich kompilieren und ausführen dies als normale i erhalten die erwartete Ausgabe:

$ ./test 
Test 1 
Test 2 
Test 3 
Test 4 

Aber wenn ich die Ausgabe umleiten ich nichts von der Python-Code:

$ ./test | cat 
Test 1 
Test 2 
Test 4 

Was passiert? Und noch wichtiger, wie bekomme ich meine Python-Ausgabe wie erwartet in stdout geschrieben?

+0

Interessant, dass wenn Sie hinzufügen "import sys; sys.stdout.flush() ''an das Python-Skript, erhalten Sie die umgeleitete Ausgabe, aber _before_ alles andere. – doublep

Antwort

2

Wenn sich auf ein Terminal bezieht, wird der Ausgang ansonsten gepuffert, was Block oder vollständig gepuffert ist, und wird erst ausgegeben, wenn der Block voll ist.

Um die Ausgangsleitung gepuffert, wenn stdout zu nicht-Terminal bezieht, stellen Sie den Modus mit setvbuf
Und Sie haben Py_Finalize() zu nennen libpython schließen seine I/O Griff zu haben.

#include <Python.h> 
#include <stdio.h> 

int 
main(int argc, char **argv) { 
    //setlinebuf(stdout); 
    setvbuf(stdout, NULL, _IOLBF, 0); 
    printf("Test 1\n"); 
    Py_Initialize(); 
    printf("Test 2\n"); 
    PyRun_SimpleString("print('Test 3')"); 
    Py_Finalize(); 
    printf("Test 4\n"); 
    return 0; 
} 
+0

Sie können 'sys.stdout.flush()' in Python aufrufen. Der Aufruf von 'Py_Finalize()' ist möglicherweise nicht für seinen Anwendungsfall interessant. – tynn

+0

@tynn Wenn Sie 'Py_Finalize()' nicht aufrufen, ist die Ausgabe nicht in Ordnung, das ist Pythons erstes. –

+0

Ah ... natürlich, alles scheint jetzt so offensichtlich :) Danke! –

Verwandte Themen