Het verschil tussen sys.stdout.write en print?

Zijn er situaties waarin sys.stdout.write()de voorkeur heeft boven print?

(Voorbeelden:betere prestaties; code die logischer is)


Antwoord 1, autoriteit 100%

printis slechts een dunne wrapper die de invoer opmaakt (aanpasbaar, maar standaard met een spatie tussen args en newline aan het einde) en de schrijffunctie van een bepaald object aanroept. Standaard is dit object sys.stdout, maar u kunt een bestand doorgeven met behulp van het “chevron”-formulier. Bijvoorbeeld:

print >> open('file.txt', 'w'), 'Hello', 'World', 2+3

Zie: https://docs. python.org/2/reference/simple_stmts.html?highlight=print#the-print-statement


In Python 3.x wordt printeen functie, maar het is nog steeds mogelijk om iets anders door te geven dan sys.stdoutdankzij het fileargument.

print('Hello', 'World', 2+3, file=open('file.txt', 'w'))

Zie https://docs.python.org/3/library/functions .html#print


In Python 2.6+ is printnog steeds een statement, maar het kan gebruikt worden als een functie met

from __future__ import print_function

Update: Bakuriu merkte op dat er een klein verschil is tussen de printfunctie en het printstatement (en meer in het algemeen tussen een functie en een statement).

In geval van een fout bij het evalueren van argumenten:

print "something", 1/0, "other" #prints only something because 1/0 raise an Exception
print("something", 1/0, "other") #doesn't print anything. The function is not called

Antwoord 2, autoriteit 52%

printconverteert eerst het object naar een string (als het nog geen string is). Er wordt ook een spatie voor het object geplaatst als dit niet het begin van een regel is en een teken voor een nieuwe regel aan het einde.

Als je stdoutgebruikt, moet je het object zelf naar een string converteren (door bijvoorbeeld “str” aan te roepen) en er is geen teken voor een nieuwe regel.

Dus

print 99

is gelijk aan:

import sys
sys.stdout.write(str(99) + '\n')

Antwoord 3, autoriteit 14%

Hier is wat voorbeeldcode gebaseerd op het boek Leren Pythonvan Mark Lutz dat uw vraag behandelt:

import sys
temp = sys.stdout                 # store original stdout object for later
sys.stdout = open('log.txt', 'w') # redirect all prints to this log file
print("testing123")               # nothing appears at interactive prompt
print("another line")             # again nothing appears. it's written to log file instead
sys.stdout.close()                # ordinary file object
sys.stdout = temp                 # restore print commands to interactive prompt
print("back to normal")           # this shows up in the interactive prompt

Als u log.txt in een teksteditor opent, wordt het volgende onthuld:

testing123
another line

Antwoord 4, autoriteit 13%

Mijn vraag is of er al dan niet
zijn situaties waarin
sys.stdout.write()verdient de voorkeur boven
print

Nadat ik onlangs een script had ontwikkeld, heb ik het geüpload naar een Unix-server. Al mijn foutopsporingsberichten maakten gebruik van print-instructies, en deze verschijnen nietin een serverlogboek.

Dit is een geval waarin je in plaats daarvan misschien sys.stdout.writenodig hebt.


Antwoord 5, autoriteit 5%

Er is ten minste één situatie waarin u sys.stdoutwilt in plaats van afdrukken.

Als u een regel wilt overschrijven zonder naar de volgende regel te gaan, bijvoorbeeld bij het tekenen van een voortgangsbalk of een statusbericht, moet u iets herhalen als

Note carriage return-> "\rMy Status Message: %s" % progress

En aangezien print een nieuwe regel toevoegt, kunt u beter sys.stdoutgebruiken.


Antwoord 6, autoriteit 3%

Mijn vraag is of er situaties zijn waarin sys.stdout.write()de voorkeur heeft boven print

Als u een opdrachtregeltoepassing schrijft die zowel naar bestanden als naar stdout kan schrijven, is dat handig. Je kunt dingen doen als:

def myfunc(outfile=None):
    if outfile is None:
        out = sys.stdout
    else:
        out = open(outfile, 'w')
    try:
        # do some stuff
        out.write(mytext + '\n')
        # ...
    finally:
        if outfile is not None:
            out.close()

Het betekent wel dat u de with open(outfile, 'w') as out:patroon, maar soms is het de moeite waard.


7, Autoriteit 2%

In 2.x, de printVerklaring Preprocessen Wat u het geeft, draait u het aan in snaren langs de weg, het omgaan met scheiders en newlines en het toestaan ​​van omleiding in een bestand. 3.x verandert het in een functie, maar heeft nog steeds dezelfde verantwoordelijkheden.

sys.stdoutis een bestand of bestand-zoals die methoden heeft om eraan te schrijven, die snaren of iets langs die lijn.


8

Een verschil tussen printen sys.stdout.writeOm aan te wijzen in Python 3, is ook de waarde die wordt geretourneerd wanneer deze wordt uitgevoerd in de terminal. In Python 3, sys.stdout.writeRetourneert de lengte van de tekenreeks, terwijl printretourneert alleen None.

Dus het uitvoeren van de volgende code interactief in de terminal zou de tekenreeks afdrukken, gevolgd door zijn lengte, aangezien de lengte wordt geretourneerd en uitvoer wanneer deze interactief wordt uitgevoerd:

>>> sys.stdout.write(" hi ")
 hi 4

9

Het heeft de voorkeur wanneer dynamisch afdrukken nuttig is, bijvoorbeeld om informatie in een lang proces te geven:

import time, sys
Iterations = 555
for k in range(Iterations+1):
    # Some code to execute here ...
    percentage = k / Iterations
    time_msg = "\rRunning Progress at {0:.2%} ".format(percentage)
    sys.stdout.write(time_msg)
    sys.stdout.flush()
    time.sleep(0.01)

10

In Python 3 is er geldige reden om afdruk te gebruiken over sys.stdout.write, maar deze reden kan ook worden omgezet in een reden om sys.stdout.writein plaats daarvan.

Deze reden is dat, nu afdrukken is een functie in Python 3, u kunt dit overschrijven. U kunt dus overal afdrukken in een eenvoudig script gebruiken en deze afdrukverklaringen bepalen, moet u in plaats daarvan schrijven naar stderr. U kunt nu net de afdrukfunctie opnieuw definiëren, u kunt zelfs de afdrukfunctie globaal wijzigen door het te wijzigen met behulp van de ingebouwde module. Natuurlijk met file.writeU kunt opgeven welk bestand is, maar met overschrijvende afdruk kunt u ook de lijnscheider of argument-separator opnieuw definiëren.

andersom is. Misschien ben je absoluut zeker van je schrijven naar stdout, maar weet ook dat je op iets anders gaat veranderen, je kunt besluiten sys.stdout.writeen gebruik te gebruiken Afdrukken voor foutlog of iets anders.

Dus wat u gebruikt, hangt af van hoe u het wilt gebruiken. printis flexibeler, maar dat kan een reden zijn om het wel en niet te gebruiken. Ik zou toch voor flexibiliteit kiezen en voor print kiezen. Een andere reden om in plaats daarvan printte gebruiken, is bekendheid. Meer mensen begrijpen nu wat je bedoelt met print en minder mensen weten sys.stdout.write.


Antwoord 11

Als u in Python 2 een functie moet doorgeven, kunt u os.sys.stdout.writetoewijzen aan een variabele. U kunt dit niet doen (in de REPL) met print.

>import os
>>> cmd=os.sys.stdout.write
>>> cmd('hello')
hello>>>

Dat werkt zoals verwacht.

>>> cmd=print
  File "<stdin>", line 1
    cmd=print
            ^
SyntaxError: invalid syntax

Dat werkt niet. printis een magische functie.


Antwoord 12

Zijn er situaties waarin sys.stdout.write() de voorkeur verdient boven
afdrukken?

Ik werk bijvoorbeeld aan een kleine functie die sterren in piramideformaat afdrukt wanneer het getal als argument wordt doorgegeven, hoewel je dit kunt bereiken door end=””te gebruiken om print in een aparte regel, ik heb sys.stdout.writegebruikt in samenwerking met printom dit te maken werk. Om dit verder uit te werken drukt stdout.writein dezelfde regel af waar als printde inhoud altijd in een aparte regel wordt afgedrukt.

import sys
def printstars(count):
    if count >= 1:
        i = 1
        while (i <= count):
            x=0
            while(x<i):
                sys.stdout.write('*')
                x = x+1
            print('')
            i=i+1
printstars(5)

13

Een van de verschillen is het volgende, bij het proberen een byte in zijn hexadecimale uitstraling te printen. We weten bijvoorbeeld dat de decimale waarde van 2550xFFin hexadecimale uitstraling is:

val = '{:02x}'.format(255)
sys.stdout.write(val) # Prints ff2
print(val)            # Prints ff

14

Zijn er situaties waarin Sys.stdout.Write () de voorkeur heeft om af te drukken?

Ik heb ontdekt dat stdout beter werkt dan afdrukken in een multithreading-situatie. Ik gebruik een wachtrij (fifo ) om de lijnen op te slaan om te printen en ik houd alles vast Threads vóór de afdruklijn totdat mijn afdrukwachtrij leeg is. Toch verliest u afdrukken soms de laatste \ N op de Debug I / O (met behulp van de wing pro ide ).

Wanneer ik std.Out met \ n in de reeks gebruik, worden de Debug I / O-indelingen correct en de \ N’s nauwkeurig weergegeven.

Other episodes