import sysfrom contextlib import contextmanagerimport functools@contextmanagerdef stdout(filename): with open(filename, 'a') as outfile: stdout_old = sys.stdout sys.stdout = outfile yield sys.stdout = stdout_olddef redirect_stdout(f, filename): @functools.wraps(f) def wrapper(*args, **kwargs): with stdout(filename): f(*args, **kwargs) return wrapperdef testfn(): print 'hello'testfn() # vypise hello na standartni vystuptestfn = redirect_stdout(testfn, 'somefile.txt')testfn() # vypise hello do souboru somefile.txt
def redirect_stdout(f, filename): @functools.wraps(f) def wrapper(*args, **kwargs): with stdout(filename): return f(*args, **kwargs) return wrapper
Zdravim,pisu unit test funkce, ktera generuje kopec veci do stdout. Stdout vystup funkce chci presmerovat do souboru, ale vystupy testu nechat v stdout.Nejake tipy?Diky
Ještě je potřeba ošetřit výjimky - přidat finally, tak jak je to v příkladu na https://docs.python.org/2/library/contextlib.html#contextlib.closing. Jinak k navrácení původní stdout nedojde.
@contextmanagerdef stdout(filename): with open(filename, 'a') as outfile: stdout_old = sys.stdout sys.stdout = outfile try: yield finally: sys.stdout = stdout_old
Citace: JanS 27. 05. 2016, 15:39:34Zdravim,pisu unit test funkce, ktera generuje kopec veci do stdout. Stdout vystup funkce chci presmerovat do souboru, ale vystupy testu nechat v stdout.Nejake tipy?DikyMožná to zní jako divná rada, kterou však praktikuji: Ve funkcích nic neposílat do stdout.
Citace: Kit 30. 05. 2016, 16:40:27Citace: JanS 27. 05. 2016, 15:39:34Zdravim,pisu unit test funkce, ktera generuje kopec veci do stdout. Stdout vystup funkce chci presmerovat do souboru, ale vystupy testu nechat v stdout.Nejake tipy?DikyMožná to zní jako divná rada, kterou však praktikuji: Ve funkcích nic neposílat do stdout.+1Proc proste jen nepredat stream (nebo nejaky Python ekvivalent) jako parametr funkce?
Citace: noef 01. 06. 2016, 07:03:35Citace: Kit 30. 05. 2016, 16:40:27Citace: JanS 27. 05. 2016, 15:39:34Zdravim,pisu unit test funkce, ktera generuje kopec veci do stdout. Stdout vystup funkce chci presmerovat do souboru, ale vystupy testu nechat v stdout.Nejake tipy?DikyMožná to zní jako divná rada, kterou však praktikuji: Ve funkcích nic neposílat do stdout.+1Proc proste jen nepredat stream (nebo nejaky Python ekvivalent) jako parametr funkce?Co je to za programátora, který tak nějak samozřejmě předpokládá, že může hrabat do zdrojáku?
Citace: BoneFlute 01. 06. 2016, 09:42:27Citace: noef 01. 06. 2016, 07:03:35Citace: Kit 30. 05. 2016, 16:40:27Citace: JanS 27. 05. 2016, 15:39:34Zdravim,pisu unit test funkce, ktera generuje kopec veci do stdout. Stdout vystup funkce chci presmerovat do souboru, ale vystupy testu nechat v stdout.Nejake tipy?DikyMožná to zní jako divná rada, kterou však praktikuji: Ve funkcích nic neposílat do stdout.+1Proc proste jen nepredat stream (nebo nejaky Python ekvivalent) jako parametr funkce?Co je to za programátora, který tak nějak samozřejmě předpokládá, že může hrabat do zdrojáku?Nerozumím.
Citace: BoneFlute 01. 06. 2016, 09:42:27Co je to za programátora, který tak nějak samozřejmě předpokládá, že může hrabat do zdrojáku?To jako testuju kod knihovny, do ktere nemuzu hrabat, nebo jak to mam chapat? Vetsinou se pisi unit testy pro kod vlastni tvorby. Pokud se takto chova nejaka knihovna pouzita v mem kodu, tak ji budto nahradim normalni alternativou (nepovazuji za normalni takto nevyzadane spamovat vystup), nebo to resim se zodpovednou osobou/firmou.
Co je to za programátora, který tak nějak samozřejmě předpokládá, že může hrabat do zdrojáku?