[Python] Output buffering?

Pagina: 1
Acties:

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18
Ik wil in Python graag het print statement zo veranderen dat het gewoon een variabele concateneert in plaats van naar de stdout schrijft (zoals in PHP kan met output buffering). Is er een makkelijke manier om dat te doen, of moet ik dan zelf een object schrijven dat functioneert als een file descriptor en daar de stdout aan binden?

Rustacean


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Bedoel je dat er op plaatsen in de code waar print al aangeroepen wordt naar een buffer moet worden geschreven, of heb je zelf nog controle over de aanroep?

In het laatste geval: voldoet 'format' dan niet? Je kan ook >> gebruiken, die file-like objecten vereist. Je kan dan een StringIO meegeven.

In het eerste geval denk ik toch dat je de stdout zal moeten veranderen. Hiervoor kan je dup2 gebruiken.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18
Op zich heb ik zelf wel controle over de aanroep, maar ik vind het wel net als ik niet overal in mijn code dingen hoef aan te passen, en in plaats daarvan aan het begin kan aangeven dat print ergens de content aan een var moet toevoegen.

Zal dup2 eens onderzoeken, tnx.

[ Voor 7% gewijzigd door djc op 13-07-2004 19:43 ]

Rustacean


  • WAcKiN
  • Registratie: November 1999
  • Laatst online: 28-08-2023
In principe kan je gewoon het volgende doen:
-
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys
from cStringIO import StringIO

# maak een stringio buffer en vervang stdout  hiermee
buffer = StringIO()
sys.stdout = buffer

# 'print x' is in feite gewoon 'sys.stdout.write(x)'
print "foo"
print "bar"

# reset de originele stdout weer
sys.stdout = sys.__stdout__ 

# doe met de buffer wat je wil
print "in de buffer zit:"
print buffer.getvalue()


Ben je toevallig met een website bezig? Misschien (waarschijnlijk ;) ) is er een betere manier om output te genereren, maar dat hangt natuurlijk helemaal af van welk web framework je gebruikt, if any.

  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 24-11 22:10

PommeFritz

...geen friet

Ik zou oppassen met het toekennen van dingen aan sys.stdout en/of sys.stderr....
Beter is waarschijnlijk om zoiets te doen:
code:
1
2
3
4
import cStringIO
myout = cStringIO.StringIO()
print >>myout, "blaat", 42
print "De string is nu:",myout.getvalue()

FireFox - neem het web in eigen hand


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Ik wist niet dat je ook een assigment kon doen aan de stdout :o . Ik weet dus ook niet of dat iets is wat je zou moeten doen. Met dup2 is het ook reuze eenvoudig: je kan gewoon een file descriptor met dup2 op de stdout zetten.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18
WAcKiN schreef op 14 juli 2004 @ 11:49:
Ben je toevallig met een website bezig? Misschien (waarschijnlijk ;) ) is er een betere manier om output te genereren, maar dat hangt natuurlijk helemaal af van welk web framework je gebruikt, if any.
Ben Python aan het leren via mod_python, omdat ik nogal gewend ben aan het programmeren voor de browser door mijn PHP ervaring. Gebruik verder niet echt een framework, ik ben om het te leren het framework dat ik in PHP gebruikte aan het ombouwen. Wat voor manieren had je verder nog in gedachten?
PommeFritz schreef op 14 juli 2004 @ 12:25:
Ik zou oppassen met het toekennen van dingen aan sys.stdout en/of sys.stderr....
Beter is waarschijnlijk om zoiets te doen:
code:
1
2
3
4
import cStringIO
myout = cStringIO.StringIO()
print >>myout, "blaat", 42
print "De string is nu:",myout.getvalue()
Waarom moet ik daar volgens jou mee oppassen? :) Het idee is juist dat ik in een module transparant print kan gebruiken en dat ik daaromheen kan zorgen dat die toch wordt afgevangen.
mbravenboer schreef op 14 juli 2004 @ 12:36:
Ik wist niet dat je ook een assigment kon doen aan de stdout :o . Ik weet dus ook niet of dat iets is wat je zou moeten doen. Met dup2 is het ook reuze eenvoudig: je kan gewoon een file descriptor met dup2 op de stdout zetten.
Ik wist wel dat je assignment kan doen aan de stdout (dat staat uitgelegd in Dive Into Python), maar had nog niet helemaal door hoe ik dit kon gebruiken.

Klopt mijn impressie dat zo'n StringIO-ding iets is als Java's StringBuffer?

[ Voor 3% gewijzigd door djc op 14-07-2004 13:10 ]

Rustacean


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Manuzhai: Klopt mijn impressie dat zo'n StringIO-ding iets is als Java's StringBuffer?
Het belangrijkste is dat het een file-like object is. Het heeft dus meer weg van de StringWriter in Java. Je kan hem overal gebruiken waar een file-like object wordt verwacht, en dat is bij de StringBuffer niet zo.

StringIO:
This module implements a file-like class, StringIO, that reads and writes a string buffer (also known as memory files).

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18
mbravenboer schreef op 14 juli 2004 @ 13:17:
Het belangrijkste is dat het een file-like object is. Het heeft dus meer weg van de StringWriter in Java. Je kan hem overal gebruiken waar een file-like object wordt verwacht, en dat is bij de StringBuffer niet zo.
Dan is dat inderdaad precies wat ik nodig heb. Zijn er nog tips waarmee ik dit soort dingen voortaan zelf kan vinden?

Rustacean


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 16-12 17:48

Robtimus

me Robtimus no like you

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • WAcKiN
  • Registratie: November 1999
  • Laatst online: 28-08-2023
Manuzhai schreef op 14 juli 2004 @ 13:09:
[...]
Ben Python aan het leren via mod_python, omdat ik nogal gewend ben aan het programmeren voor de browser door mijn PHP ervaring. Gebruik verder niet echt een framework, ik ben om het te leren het framework dat ik in PHP gebruikte aan het ombouwen. Wat voor manieren had je verder nog in gedachten?
Nou, uit je vraag lijkt het alsof je print gebruikt om HTTP output te 'maken' zeg maar. Lijkt het je niet beter om een template-library te gebruiken die om data-structuren heen werkt, of een XML/HTML render library? Vooral als je met niet-ascii ouput te maken krijgt is het erg handig als je een centrale plek krijgt waar je unicode strings gaat encoden in de encoding waarin je je output moet hebben.

Op de python.org wiki hebben ze een mooie lijst met web-programming gerelateerde libraries en frameworks staan. Ook een grote lijst met template libraries. Persoonlijk heb ik ervaring met de SimpleTAL en Cheetah template libs, waarvan ik SimpleTAL de 'cleanere' vind naar cheetah toch flexibeler en perhaps efficienter is, daar het template in python code omzet.

Met Python web-frameworks heb ik helaas geen tot weinig ervaring, op ons eigen framework na dan, maar die is niet python-specifiek. Wat ik wel weet is dat ik nooit meer op de old-skool PHP manier websites wil gaan maken ;) ...

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18
Ik schrijf ook geen HTML weg via print, maar XML, en die haal ik vervolgens keihard door mijn libxslt-transformatortje heen (*aai*). Probleem opgelost!

Rustacean

Pagina: 1