Хорошо, я думаю, что теперь у меня есть ответ на ваш вопрос, и я вижу два разных подхода, которые вы могли бы использовать.
Если вы абсолютно хотите предоставить оболочке в дочернем процессе уже открытый дескриптор файла, тогда вы можете заменить Popen()
из cat
вызовом os.pipe()
. Это даст вам подключенную пару реальных файловых дескрипторов (не объектов Python file
). Все, что записано во второй файловый дескриптор, может быть прочитано из первого, заменив ваш фальсифицированный жюри cat
-pipe. (Хотя "кот-труба" интересно сказать ...). Пара сокетов (socket.socketpair()
) также может быть использована для достижения того же конца, если вам нужна двунаправленная пара.
Кроме того, вы могли бы упростить свою жизнь еще больше, используя именованный канал (он же FIFO). Если вы не знакомы с этим средством, именованный канал - это однонаправленный канал, расположенный в пространстве имен файловой системы. Функция os.mkfifo()
создаст канал в файловой системе. Затем вы можете открыть канал для чтения в вашем основном процессе и открыть его для записи / прямого вывода на него из вашего дочернего процесса оболочки. Это должно упростить ваш код и открыть возможность использования существующей библиотеки, такой как Pexpect , для взаимодействия с оболочкой.