Hoe kan ik de uitvoer van de afdrukfunctie doorspoelen?

Hoe forceer ik Python’s printFunctie om naar het scherm te worden uitgevoerd?


1, Autoriteit 100%

in Python 3, printkan nemen Een optionele flushargument:

print("Hello, World!", flush=True)

In Python 2 moet je

doen

import sys
sys.stdout.flush()

Na het bellen van print. Standaard, printPrints 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.stdoutin ongebufferde modus opnieuw openen:

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

elk stdout.writeEN printWERKING 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)

Python Docs Entry


6, Autoriteit 2%

Gebruik van de -uopdrachtregelschakelaar 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 printoproepen (die sys.stdoutimpliciet gebruiken), wordt automatisch flushed.


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.

Other episodes