Python sys.stdout и C ++ iostreams :: cout

Я предполагал, что sys.stdout будет ссылаться на тот же физический поток, что и iostreams :: cout, запущенный в том же процессе, но, похоже, это не так.
Следующий код, который выполняет вызов функции C ++ с помощью оболочки Python «write», которая записывает в cout:

from cStringIO import StringIO
import sys
orig_stdout = sys.stdout
sys.stdout = stringout = StringIO()
write("cout") # wrapped C++ function that writes to cout
print "-" * 40
print "stdout"sys.stdout = orig_stdout
print stringout.getvalue()

немедленно записывает «cout» в консоль, затем разделитель «—…» и, наконец, в качестве возвращаемого значения stringout.getvalue () строку «stdout».
Я хотел записать в stringout также строку, написанную для cout из C ++.
Кто-нибудь знает, что происходит, и если так, как я могу записать то, что написано для cout в строке Python?

Заранее спасибо.

4

Решение

sys.stdout это объект Python, который пишет в стандартный вывод Это не на самом деле дескриптор стандартного выходного файла; Это обертывания этот дескриптор файла. Изменение объекта, который sys.stdout указывает на то, что в Python-Land никак не влияет на stdout ручка или std::cout Потоковый объект в C ++.

6

Другие решения

С помощью comp.lang.python и после некоторых поисков на этом сайте:
Как указал cdhowie, стандартный дескриптор выходного файла должен быть доступен на более низком уровне. Фактически, его файловый дескриптор может быть получен как sys.stdout.fileno () (который должен быть 1), а затем могут быть использованы os.dup и os.dup2.

я нашел этот ответ на подобный вопрос очень полезно.

Что я действительно хотел, так это записать вывод в строку, а не в файл. Однако класс Python StringIO не имеет файлового дескриптора и не может использоваться вместо реального файла, поэтому я нашел не совсем удовлетворительный обходной путь, при котором временный файл записывается и впоследствии читается.

2

Это не может быть тот же поток, так как Python написан на
C, а не C ++, и не имеет доступа к std::cout, Будь то
использования stdout или реализует свой собственный поток на основе fd 1,
Я не знаю, но в любом случае вам посоветуют
пишет с использованием двух объектов (Python и C ++).

1
По вопросам рекламы [email protected]