Hoe forceer ik Python’s print
Functie om naar het scherm te worden uitgevoerd?
1, Autoriteit 100%
in Python 3, print
kan nemen Een optionele flush
argument:
print("Hello, World!", flush=True)
In Python 2 moet je
doen
import sys
sys.stdout.flush()
Na het bellen van print
. Standaard, print
Prints voor sys.stdout
( Zie de documentatie voor meer over bestandsobjecten ).
2, Autoriteit 23%
Draaien python -h
, ik zie een optie opdrachtregel :
-U: onbevalde binaire stdout en onbeleefdheid; ook pythonunbuffered = x
Zie manpagina voor details over interne buffering met betrekking tot ‘-u’
Hier is de relevante documentatie .
3, Autoriteit 20%
Sinds Python 3.3 kunt u de normale print()
-functie dwingen om door te spoelen zonder de noodzaak om sys.stdout.flush()
te gebruiken; Stel gewoon het “flush” -woordsargument in op TRUE. Van de documentatie :
print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)
Druk objecten af naar het stroombestand, gescheiden door sep en gevolgd door end. sep, end en file, indien aanwezig, moeten als trefwoordargumenten worden opgegeven.
Alle niet-trefwoordargumenten worden geconverteerd naar strings zoals str() dat doet en naar de stream geschreven, gescheiden door sep en gevolgd door end. Zowel sep als end moeten strings zijn; ze kunnen ook Geen zijn, wat betekent dat de standaardwaarden moeten worden gebruikt. Als er geen objecten worden gegeven, zal print() alleen end schrijven.
Het bestandsargument moet een object zijn met een write(string)-methode; als het niet aanwezig is of Geen, wordt sys.stdout gebruikt. Of de uitvoer wordt gebufferd, wordt meestal bepaald door het bestand, maar als het argument voor het zoekwoord flush waar is, wordt de stream geforceerd leeggemaakt.
4, Autoriteit 4%
ook, zoals gesuggereerd in deze blog Post , men kan sys.stdout
in ongebufferde modus opnieuw openen:
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
elk stdout.write
EN print
WERKING WORDT NADACHTER NADAGEN.
5, Autoriteit 4%
Met Python 3.x De print()
Functie is verlengd:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
Dus, u kunt het gewoon doen:
print("Visiting toilet", flush=True)
6, Autoriteit 2%
Gebruik van de -u
opdrachtregelschakelaar werkt, maar het is een beetje onhandig. Het zou betekenen dat het programma mogelijk niet verkeerd gedraagt als de gebruiker het script oproept zonder de optie -u
. Ik gebruik meestal een aangepaste stdout
, zoals deze:
class flushfile:
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
import sys
sys.stdout = flushfile(sys.stdout)
… Nu al uw print
oproepen (die sys.stdout
impliciet gebruiken), wordt automatisch flush
ed.
7
Gebruik een onbevestigd bestand:
f = open('xyz.log', 'a', 0)
of
sys.stdout = open('out.log', 'a', 0)
8
Dan’s Idea werkt niet helemaal:
#!/usr/bin/env python
class flushfile(file):
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
import sys
sys.stdout = flushfile(sys.stdout)
print "foo"
Het resultaat:
Traceback (most recent call last):
File "./passpersist.py", line 12, in <module>
print "foo"
ValueError: I/O operation on closed file
Ik ben van mening dat het probleem is dat het erft van de bestandsklasse, die eigenlijk niet nodig is. Volgens de documentatie voor Sys.stdout:
Stdout en Stderr hoeven niet te worden ingebouwd
Bestandsobjecten: elk object is acceptabel
zolang het een methode () heeft
dat neemt een string-argument.
dus wijzigen
class flushfile(file):
Naar
class flushfile(object):
Maakt het prima.
9
Hier is mijn versie, die ook writelines() en fileno() biedt:
class FlushFile(object):
def __init__(self, fd):
self.fd = fd
def write(self, x):
ret = self.fd.write(x)
self.fd.flush()
return ret
def writelines(self, lines):
ret = self.writelines(lines)
self.fd.flush()
return ret
def flush(self):
return self.fd.flush
def close(self):
return self.fd.close()
def fileno(self):
return self.fd.fileno()
Antwoord 10
In Python 3 kun je de functie printoverschrijven met de standaardinstelling flush = True
def print(*objects, sep=' ', end='\n', file=sys.stdout, flush=True):
__builtins__.print(*objects, sep=sep, end=end, file=file, flush=flush)
Antwoord 11
Ik deed het zo in Python 3.4:
'''To write to screen in real-time'''
message = lambda x: print(x, flush=True, end="")
message('I am flushing out now...')
Antwoord 12
Ik had eerst moeite om te begrijpen hoe de spoeloptie werkte. Ik wilde een ‘laadweergave’ doen en hier is de oplossing die ik heb gevonden:
for i in range(100000):
print('{:s}\r'.format(''), end='', flush=True)
print('Loading index: {:d}/100000'.format(i+1), end='')
De eerste regel wist de vorige afdruk en de tweede regel drukt een nieuw bijgewerkt bericht af. Ik weet niet of hier een syntaxis van één regel bestaat.