Могу ли я написать в терминал и данный файл с помощью одной команды в Python? - PullRequest
2 голосов
/ 14 марта 2011

Я видел ответ на этот вопрос со ссылкой на Bash, но не могу найти его для Python.Извиняюсь, если это что-то повторяет.

Можно ли печатать на терминал и в выходной файл одной командой?Я знаком с использованием print >> и sys.stdout = WritableObject, но я бы хотел избежать дублирования команд печати для каждой строки, которую я хочу зарегистрировать.

Я использую Python 2.6, на всякий случайзнание необходимо.

Что еще более важно, я хочу, чтобы это выполнялось в системе на базе Windows с использованием командной строки IDLE.Итак, по сути, я хочу, чтобы скрипт python сообщал на терминал IDLE и в заданный файл журнала.

EDIT : Для всех, кто найдет это и решит пойти с выбранным мной ответом,Если вам нужна помощь в понимании менеджеров контекста (как я это сделал), я рекомендую Даг Хеллман «Модули Python недели» для разъяснения. В этом подробно описывается библиотека контекста. Для получения справки по оформителям см. Ответы на этот вопрос переполнения стека.

Ответы [ 3 ]

6 голосов
/ 14 марта 2011

Заменить sys.stdout.

class PrintAndLog(object):
    def __init__(self, fileOrPath): # choose which makes more sense
        self._file = ...

    def write(s):
        sys.stdout.write(s)
        self._file.write(s)

    def close(self):
        self._file.close()
    # insert wrappers for .flush, .writelines

_old_stdout = sys.stdout
sys.stdout = PrintAndLog(f)
... # print and stuff
sys.stdout = _old_stdout

Можно поместить в диспетчер контекста (это уже третий раз, когда я вижу что-то подобное только на SO ...):

from contextlib import contextmanager

@contextmanager
def replace_stdout(f):
    old_stdout = sys.stdout
    try:
        sys.stdout = PrintAndLog(f)
        yield
    finally:
        sys.stdout = old_stdout
2 голосов
/ 14 марта 2011

Почему бы просто не написать функцию?

def myPrint(anOpenFileObject, message):
    print message
    anOpenFileObject.write(message)
0 голосов
/ 14 марта 2011

Если вы работаете в Unix: в начале вашей программы вы могли бы mkfifo именованный канал и запустить в bg cat от него до тройника терминала и желаемого выходного файла.,Затем по всей вашей программе выведите на fd именованный канал.Наконец, перед тем, как выйти, передайте именованный канал.

Но, честно говоря, я бы просто сделал обертку вокруг отпечатка, который печатает на оба деска.

...