Какой лучший способ справиться с перенаправлением вывода? - PullRequest
0 голосов
/ 13 февраля 2011

Я хочу, чтобы моя программа по умолчанию была stdout, но дала возможность записать ее в файл.Должен ли я создать свою собственную функцию печати и вызвать это тестирование на наличие выходного файла или есть лучший способ?Это кажется мне неэффективным, но каждый раз, когда я могу думать о вызовах, требуется дополнительный тест if для каждого вызова печати.Я знаю, что на самом деле это, в конце концов, не имеет значения, по крайней мере, для этого сценария, но я просто пытаюсь выучить хорошие привычки.

Ответы [ 6 ]

4 голосов
/ 13 февраля 2011

Просто напишите в стандартный формат, используя печать.Если пользователь хочет перенаправить вывод в файл, он может сделать это:

python foo.py > output.txt
2 голосов
/ 13 февраля 2011

Запись в объект файла, и когда программа запускается, укажите этому объекту sys.stdout или файл, указанный пользователем.

Ответ Марка Байерса более похож на unix, где большинство инструментов командной строки просто используют stdin и stdout и позволяют пользователю выполнять перенаправление по своему усмотрению.

1 голос
/ 13 февраля 2011

Нет, вам не нужно создавать отдельную функцию печати.В Python 2.6 у вас есть такой синтаксис:

# suppose f is an open file
print >> f, "hello"

# now sys.stdout is file too
print >> sys.stdout, "hello"

В Python 3.x:

print("hello", file=f)
# or
print("hello", file=sys.stdout)

Так что вам действительно не нужно различать файлы и стандартный вывод.Они одинаковы.

Игрушечный пример, который выводит "привет" так, как вы хотите:

#!/usr/bin/env python3
import sys

def produce_output(fobj):
    print("hello", file=fobj)
    # this can also be
    # fobj.write("hello\n")

if __name__=="__main__":
    if len(sys.argv) > 2:
        print("Too many arguments", file=sys.stderr)
        exit(1)

    f = open(argv[1], "a") if len(argv)==2 else sys.stdout
    produce_output(f)

Обратите внимание, что процедура печати абстрагируется от того, работает ли она с stdout илифайл.

0 голосов
/ 13 февраля 2011

Если вы используете модуль подпроцесса, то в зависимости от параметра, который вы берете из командной строки, вы можете использовать параметр stdout для открытого объекта файла. Таким образом, из программы вы можете перенаправить в файл.

import subprocess
with open('somefile','w') as f:
    proc = subprocess.Popen(['myprog'],stdout=f,stderr=subprocess.PIPE)
    out,err = proc.communicate()
    print 'output redirected to somefile'
0 голосов
/ 13 февраля 2011

Я рекомендую вам использовать модуль logging и logging.handlers ... stream, выходные файлы и т.д ..

0 голосов
/ 13 февраля 2011

Моя реакция будет заключаться в выводе во временный файл, а затем либо сбросить его в stdio, либо переместить его туда, куда они просили

...