О, ты.У меня был приличный ответ до того, как я увидел последнюю строчку вашего примера: execv ().Ну, какашки.Первоначальная идея заключалась в замене стандартного стандартного вывода каждого дочернего процесса экземпляром тройного класса этого блога и разделением потока на исходный стандартный вывод и файл журнала:
http://www.shallowsky.com/blog/programming/python-tee.html
Но, поскольку вы используете execv (), экземпляр тройника дочернего процесса будет просто забит, так что это не сработает.
К сожалению, для вас не существует "готового" решения для вашегопроблема, которую я могу найти.Самым близким было бы создание самой программы в подпроцессе;если вы хотите быть более кроссплатформенным, вы можете создать простую замену Python.
Первое, что нужно знать при кодировании замены тройника: tee действительно простая программа.Во всех реальных реализациях C, которые я видел, это не намного сложнее, чем это:
while((character = read()) != EOF) {
/* Write to all of the output streams in here, then write to stdout. */
}
К сожалению, вы не можете просто соединить два потока вместе.Это было бы очень полезно (чтобы вход одного потока автоматически переадресовывался из другого), но мы не можем позволить себе такую роскошь, не кодируя его сами.Итак, у Эли и меня будут очень похожие ответы.Разница в том, что в моем ответе «тройник» Python будет выполняться в отдельном процессе через канал;таким образом, родительский поток все еще полезен!
(Помните: скопируйте класс тройки в блоге тоже.)
import os, sys
# Open it for writing in binary mode.
logFile=open("bar", "bw")
# Verbose names, but I wanted to get the point across.
# These are file descriptors, i.e. integers.
parentSideOfPipe, childSideOfPipe = os.pipe()
# 'Tee' subprocess.
pid = os.fork()
if pid == 0:
while True:
char = os.read(parentSideOfPipe, 1)
logFile.write(char)
os.write(1, char)
# Actual command
pid = os.fork()
if pid == 0:
os.dup2(childSideOfPipe, 1)
os.execv(cmd)
Извините, если вы этого не хотели, ноэто лучшее решение, которое я могу найти.
Удачи вам в остальной части вашего проекта!