Ich möchte Unit-Test eine C-Funktion, die auf die Stdout druckt, aber nachdem ich suchte erreichte ich os.dup
, os.pip
und andere Sachen, die nicht die coolste Möglichkeit ist, die Stdout zu erfassen einer C-Shared-Library-Funktion. also habe ich mir gedacht, Pythons stdout an die C-Funktion zu übergeben, nachdem es darauf geschrieben hat, dann kann ich die Werte testen, aber es funktioniert nicht. Hier ist der Code:übergeben Python Stdout zu einer C-Funktion, die schreiben
die Datei als gemeinsam genutzte Bibliothek kompilieren:
gcc -shared -Wl,-soname,tomat -o tomat.so -fPIC tomat.c
/* filename: tomat.c */
#include <stdio.h>
#include <unistd.h>
int
tomat(int length, FILE *stdout_)
{
int remain = 0;
while ((remain = (length -= 1)) != 0)
{
fprintf(stdout_, "00:%d\n", remain);
sleep(1);
}
return 0;
}
# filename: tomat_test.py
import sys
import ctypes
import unittest
class TomatTestCase(unittest.TestCase):
def setUp(self):
self.lib = ctypes.CDLL('./tomat.so')
def test_prints_every_second(self):
seconds = ['00:1', '00:2', '00:2', '00:3', '00:4', '00:5',
'00:6', '00:7', '00:8', '00:9']
self.lib.tomat(10, sys.stdout.fileno())
self.assertEqual(output, seconds[::-1])
Sie Sie müssen keine Datei an die C-Funktion übergeben. Es gibt kein "python stdout". Die einzige Konstante ist der gesamte Prozess. Schreib einfach was immer du brauchst an C 'stdout'. –
also sollte ich die stdout erfassen? –
Eine Funktion, die auf stdout druckt, sollte die C-Datei mit dem Namen 'stdout' verwenden, nicht von außen. Wenn Sie lesen möchten, was Ihre Funktion gedruckt hat, müssen Sie ** 'stdout' umleiten (ohne die Funktion zu ändern, die immer noch' stdout' verwenden soll) und dann ** den umgeleiteten Stream lesen **. –