Я предполагал, что 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?
Заранее спасибо.
sys.stdout
это объект Python, который пишет в стандартный вывод Это не на самом деле дескриптор стандартного выходного файла; Это обертывания этот дескриптор файла. Изменение объекта, который sys.stdout
указывает на то, что в Python-Land никак не влияет на stdout
ручка или std::cout
Потоковый объект в C ++.
С помощью comp.lang.python и после некоторых поисков на этом сайте:
Как указал cdhowie, стандартный дескриптор выходного файла должен быть доступен на более низком уровне. Фактически, его файловый дескриптор может быть получен как sys.stdout.fileno () (который должен быть 1), а затем могут быть использованы os.dup и os.dup2.
я нашел этот ответ на подобный вопрос очень полезно.
Что я действительно хотел, так это записать вывод в строку, а не в файл. Однако класс Python StringIO не имеет файлового дескриптора и не может использоваться вместо реального файла, поэтому я нашел не совсем удовлетворительный обходной путь, при котором временный файл записывается и впоследствии читается.
Это не может быть тот же поток, так как Python написан на
C, а не C ++, и не имеет доступа к std::cout
, Будь то
использования stdout
или реализует свой собственный поток на основе fd 1,
Я не знаю, но в любом случае вам посоветуют
пишет с использованием двух объектов (Python и C ++).