วิธีการพิมพ์ไปยัง stderr ใน Python?


1339

มีหลายวิธีในการเขียนถึง stderr:

# Note: this first one does not work in Python 3
print >> sys.stderr, "spam"

sys.stderr.write("spam\n")

os.write(2, b"spam\n")

from __future__ import print_function
print("spam", file=sys.stderr)

ที่ดูเหมือนว่าจะขัดแย้งเซนของงูใหญ่ # 13 ดังนั้นสิ่งที่แตกต่างกันที่นี่และจะมีข้อดีหรือข้อเสียในทางเดียวหรืออื่น ๆ หรือไม่ ควรใช้วิธีใด

ควรมีอย่างใดอย่างหนึ่ง - และดีกว่าเพียงคนเดียว - วิธีที่ชัดเจนที่จะทำ


46
วิธีแรกที่แสดงรายการเป็นหนึ่งในหลาย ๆ สิ่งที่ถูกลบใน Python 3 ฉันทามติดูเหมือนจะเป็นว่า >> ไวยากรณ์นั้นน่าเกลียดอยู่ดีและเนื่องจากการพิมพ์เป็นฟังก์ชั่นตอนนี้ไวยากรณ์จะไม่ทำงาน
Steve Howard

23
ผมใช้: sys.exit ( 'ข้อผิดพลาด: <ข้อผิดพลาดข้อความ>')
สิ้นเชิง

1
เพียงใช้พิมพ์
PythonMaster202

คำตอบ:


1164

ฉันพบว่านี่เป็นเพียงสั้น ๆ + ยืดหยุ่น + พกพา + อ่านได้:

from __future__ import print_function
import sys

def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

ฟังก์ชั่นeprintสามารถใช้งานได้ในลักษณะเดียวกับprintฟังก์ชั่นมาตรฐาน:

>>> print("Test")
Test
>>> eprint("Test")
Test
>>> eprint("foo", "bar", "baz", sep="---")
foo---bar---baz

29
ความคิดเพียงอย่างเดียว: เนื่องจากสิ่งนี้จะนำเข้าฟังก์ชั่นการพิมพ์ทุก ๆ "การพิมพ์" ในสคริปต์ต้นฉบับจะต้องมีการ "เพิ่มฟังก์ชั่น" เพิ่ม "(" และ ")" นั่นคือการประท้วงเล็กน้อยกับวิธีนี้ IMO
Dan H

45
@DanH ใช่นี่บังคับให้คุณสร้างโค้ด Python3 ของคุณ ฉันคิดว่านี่อาจเป็นเหตุผลว่าทำไมหลายคนถึงชอบมัน!
MarcH

18
@ MarkH ... ใช่มันบังคับให้คุณสร้างรหัส Python3 ของคุณพร้อม ... มันยังบังคับให้คุณทำตอนนี้เพียงพิมพ์ข้อมูลการแก้ไขจุดบกพร่องไปยัง stderr ... ซึ่งฉันจะพบว่ายุ่งยากมากขึ้น สถานการณ์ส่วนใหญ่เมื่อฉันพยายามที่จะแก้ปัญหาบางอย่าง (ฉันไม่ต้องการแนะนำข้อผิดพลาดทางไวยากรณ์ใหม่!) :-)
Dan H

29
FWIW รหัสนี้ไม่ได้บังคับให้คุณใช้รุ่นฟังก์ชั่นของprintในโปรแกรมทั้งหมดของคุณ eprint()เฉพาะในโมดูลที่มีความหมายของ ใส่ไว้ในไฟล์ขนาดเล็กด้วยตัวเองนำเข้าeprintจากไฟล์นั้นไปยังไฟล์อื่นของคุณและคุณสามารถใช้คำสั่งต่อไปได้printนานเท่าที่คุณต้องการ
alexis

3
นอกจากนี้คุณยังแปลงจากฟังก์ชั่นการพิมพ์เป็นงานพิมพ์เป็นการค้นหาแบบง่าย ๆ ที่แทนที่ 2to3 โดยอัตโนมัติแล้วสำหรับคุณ เพียงทำไปแล้วถ้าคุณยังไม่ได้; python2 จะหายไปในเวลาน้อยกว่า 2 ปี ... บางสิ่งระหว่าง 2 ถึง 3 อาจจะยุ่งยากเล็กน้อย ฟังก์ชั่นการพิมพ์ไม่ใช่หนึ่งในนั้น ดูdocs.python.org/2/library/2to3.html
bobpaul

548
import sys
sys.stderr.write()

เป็นตัวเลือกของฉันอ่านได้ง่ายขึ้นและบอกสิ่งที่คุณตั้งใจจะทำและพกพาข้ามรุ่น

แก้ไข: การเป็น 'pythonic' เป็นความคิดที่สามสำหรับฉันเกี่ยวกับความสามารถในการอ่านและประสิทธิภาพ ... โดยคำนึงถึงสองสิ่งนี้ด้วย python 80% ของรหัสของคุณจะเป็น pythonic รายการเข้าใจว่าเป็น 'เรื่องใหญ่' ที่ไม่ได้ใช้บ่อย (อ่านง่าย)


88
อย่าลืมล้างออก
temoto

10
ข้อดีของprintคำสั่งนี้คือการพิมพ์ค่าที่ไม่ใช่สตริงได้อย่างง่ายดายโดยไม่ต้องแปลงค่าก่อน หากคุณต้องการคำสั่งพิมพ์ฉันขอแนะนำให้ใช้ตัวเลือกที่ 3 เป็น python 3 พร้อมแล้ว
vdboor

56
sys.stderr.write()printอะไรที่ชอบ มันไม่ได้เพิ่มบรรทัดใหม่
พันเอก Panic

41
@temoto - stderr ไม่ได้ถูกบัฟเฟอร์ดังนั้นไม่จำเป็นต้องล้างออก
Matt

11
@SkipHuffman os.linesepคุณหมายถึง นี่คือสิ่งที่stderrเรากำลังพูดถึงหลังจากทั้งหมด ไม่ต้องการให้คอนโซลสับสนกับการขึ้นบรรทัดใหม่ที่ผิด
jpmc26

181

print >> sys.stderrหายไปใน Python3 http://docs.python.org/3.0/whatsnew/3.0.htmlพูดว่า:

Old: print >> sys.stderr, "fatal error"
New: print("fatal error", file=sys.stderr)

สำหรับพวกเราหลายคนมันค่อนข้างผิดธรรมชาติที่จะผลักไสจุดหมายปลายทางให้จบคำสั่ง ทางเลือก

sys.stderr.write("fatal error\n")

ดูเชิงวัตถุมากขึ้นและเปลี่ยนจากแบบทั่วไปไปเป็นแบบเจาะจง แต่ทราบว่าwriteไม่ได้เป็น 1: 1 printสำหรับทดแทน


5
ฉันคิดว่ามันเป็นเรื่องของการตั้งค่า print('spam', file=sys.stderr)แต่ผมไม่เห็นสิ่งที่เป็นเรื่องที่น่าเกลียด หากคุณทำมันซ้ำแล้วซ้ำอีกคุณสามารถเขียนโค้ดฟังก์ชั่น 'eprint' ในคำตอบที่ได้รับความนิยมมากที่สุด แต่ในกรณีนี้ฉันจะถามว่ามีอะไรผิดปกติกับการบันทึก stackoverflow.com/a/41304513/1450294
Michael Scheper

อีกวิธีหนึ่งในการทำความกระจ่างแจ้งเจตนาจะทำwith sys.stderr as dest:ก่อนการเรียกเยื้องprint("ERROR", file=dest)
MarkHu

130

ยังไม่มีใครพูดถึงloggingแต่การบันทึกถูกสร้างขึ้นโดยเฉพาะเพื่อสื่อสารข้อความแสดงข้อผิดพลาด การกำหนดค่าพื้นฐานจะตั้งค่าตัวจัดการสตรีมที่เขียนไปยัง stderr

สคริปต์นี้:

# foo.py
import logging

logging.basicConfig(format='%(message)s')
log = logging.getLogger(__name__)
log.warning('I print to stderr by default')
print('hello world')

มีผลลัพธ์ต่อไปนี้เมื่อทำงานบนบรรทัดคำสั่ง:

$ python3 foo.py > bar.txt
I print to stderr by default

และbar.txtจะมีคำว่า 'hello world' พิมพ์อยู่บน stdout


2
จากประสบการณ์ของฉันผู้คนจำนวนมากใช้พิมพ์เพื่อบันทึกข้อความมากกว่าใช้บันทึก ฉันคิดว่า python4 ควรลบการพิมพ์ออกจากภาษาและบังคับให้คุณใช้การบันทึกสำหรับสิ่งนั้น
Mnebuerquo

1
นี่คือคำตอบที่ดีที่สุด !! ... ผมกำลังต่อสู้กับพิมพ์หรือ SYS หรือใครจะรู้ ... เมื่อมีการเข้าสู่ระบบที่เหมาะสมเป็นสิ่งจำเป็น ... ขอบคุณสำหรับความคิดที่ดี
คาร์ลอ Saltos

129

สำหรับPython 2ตัวเลือกของฉันคือ print >> sys.stderr, 'spam' เพราะคุณสามารถพิมพ์ลิสต์ / dicts และอื่น ๆ โดยไม่ต้องแปลงเป็นสตริง print >> sys.stderr, {'spam': 'spam'} แทน: sys.stderr.write(str({'spam': 'spam'}))


6
วิธี Pythonic ที่มากขึ้นในการพิมพ์พจนานุกรมจะเป็น"{0}".format({'spam': 'spam'})อย่างไรถ้าใช่ ฉันจะบอกว่าคุณควรหลีกเลี่ยงการแปลงสตริงเป็นอย่างชัดเจน แก้ไข: ฉันตั้งใจใช้ไวยากรณ์
luketparkinson

1
@luketparkinson ทั้งหมดนี้เกี่ยวกับการดีบัก - ดังนั้นฉันคิดว่ามันจะดีกว่าถ้าจะใช้รหัสที่ง่ายที่สุดเท่าที่จะเป็นไปได้
Frankovskyi Bogdan

88
สิ่งนี้ใช้ไม่ได้กับ Python 3 ดังนั้นคุณควรหลีกเลี่ยงในรหัสใหม่
JonnyJD

33

ฉันทำสิ่งต่อไปนี้โดยใช้ Python 3:

from sys import stderr

def print_err(*args, **kwargs):
    print(*args, file=stderr, **kwargs)

ดังนั้นตอนนี้ฉันสามารถเพิ่มอาร์กิวเมนต์คำหลักตัวอย่างเช่นเพื่อหลีกเลี่ยงการคืนค่าขนส่ง:

print_err("Error: end of the file reached. The word ", end='')
print_err(word, "was not found")

2
ฉันจะแนะนำว่าคุณสามารถใช้บางส่วนได้เช่นกัน แต่ตระหนักว่าบางส่วนกำหนด stderr ให้กับฟังก์ชัน ณ เวลาที่สร้างบางส่วน สิ่งนี้ป้องกันไม่ให้คุณเปลี่ยนเส้นทาง stderr ในภายหลังเนื่องจากบางส่วนจะยังคงวัตถุ stderr ดั้งเดิมอยู่
Rebs

31

ฉันจะบอกว่าวิธีแรกของคุณ:

print >> sys.stderr, 'spam' 

คือ "One ....วิธีที่ชัดเจนที่จะทำ" คนอื่นไม่พอใจกฎ # 1 ("Beautiful is better than ugly.")


109
ความคิดเห็นที่แตกต่าง นี่เป็นสิ่งที่ชัดเจนที่สุดสำหรับฉัน
porgarmingduod

4
@AliVeli ไม่มีวงเล็บนี่เป็น Python ที่เก่ากว่า <= 2 ไวยากรณ์และดังนั้นจึงไม่รองรับ Python 3
Rebs

30
ฉันจะบอกว่านี้เป็นรุ่นที่น่าเกลียดที่สุดของทั้ง 3
ภูเขาไฟ

4
นั่น>>หมายความว่าวากยสัมพันธ์ ฉันเข้าใจว่ามันเป็นความพยายามในการคัดลอก bash >ดังนั้นมีไวยากรณ์ของ shoehorned ทำเช่นนั้นหรือไม่
Dmytro Sirenko

2
@EarlGray มันเป็นโฮลด์จากตัวดำเนินการแทรกสตรีมของ C ++:std::cout << "spam";
Sean Allred

19

สิ่งนี้จะเลียนแบบฟังก์ชั่นการพิมพ์มาตรฐาน แต่เอาท์พุทบน stderr

def print_err(*args):
    sys.stderr.write(' '.join(map(str,args)) + '\n')

8
ฉันจะเพิ่ม sys.stderr.flush ()
AMS

4
@AMS - เพราะอะไร printไม่รวมฟลัช
Robᵩ

4
ทำไมต้องเลียนแบบเมื่อคุณสามารถทำได้จริง ๆ ?
นักฟิสิกส์บ้า

19

ใน Python 3 เราสามารถใช้print ():

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

เกือบจะออกจากกล่อง:

import sys
print("Hello, world!", file=sys.stderr)

หรือ:

from sys import stderr
print("Hello, world!", file=stderr)

ตรงไปตรงมาและไม่จำเป็นต้องมีอะไรนอกเหนือจากsys.stderrนี้


16

แก้ไขในสายตาหลังฉันคิดว่าความสับสนที่อาจเกิดขึ้นกับการเปลี่ยน sys.stderr และไม่เห็นพฤติกรรมที่อัปเดตทำให้คำตอบนี้ไม่ดีเท่ากับการใช้ฟังก์ชั่นง่ายๆอย่างที่คนอื่น ๆ ได้ชี้ให้เห็น

การใช้บางส่วนช่วยให้คุณประหยัดเพียง 1 บรรทัดของรหัส ความสับสนที่อาจเกิดขึ้นไม่คุ้มค่ากับการบันทึกโค้ด 1 บรรทัด

เป็นต้นฉบับ

เพื่อให้ง่ายยิ่งขึ้นต่อไปนี้เป็นรุ่นที่ใช้ 'บางส่วน' ซึ่งเป็นประโยชน์อย่างมากในการห่อฟังก์ชัน

from __future__ import print_function
import sys
from functools import partial

error = partial(print, file=sys.stderr)

จากนั้นคุณใช้มันอย่างนั้น

error('An error occured!')

คุณสามารถตรวจสอบว่ามันกำลังพิมพ์ไปยัง stderr และไม่ใช่ stdout โดยทำตามขั้นตอนต่อไปนี้ (รหัสการขี่เกินจากhttp://coreygoldberg.blogspot.com.au/2009/05/python-redirect-or-turn-off-stdout-and .html ):

# over-ride stderr to prove that this function works.
class NullDevice():
    def write(self, s):
        pass
sys.stderr = NullDevice()

# we must import print error AFTER we've removed the null device because
# it has been assigned and will not be re-evaluated.
# assume error function is in print_error.py
from print_error import error

# no message should be printed
error("You won't see this error!")

ข้อเสียของสิ่งนี้คือการกำหนดค่าบางส่วนของ sys.stderr ให้กับฟังก์ชั่นที่ห่อหุ้มในเวลาของการสร้าง ซึ่งหมายความว่าหากคุณเปลี่ยนเส้นทาง stderr ในภายหลังจะไม่มีผลกับฟังก์ชันนี้ หากคุณวางแผนที่จะเปลี่ยนเส้นทาง stderr ให้ใช้วิธี ** kwargs ที่ระบุโดยaaguirreในหน้านี้


โค้ดของ Corey Goldberg ทำงานได้ดีที่สุดบนเครื่อง Rube Goldberg หรือไม่? : P
Agi Hammerthief

1
BTW: "currying" เป็นคำค้นหาที่มีประโยชน์ (มากกว่า) หากคุณต้องการทราบเพิ่มเติมเกี่ยวกับ "บางส่วน"
MarcH

5

เช่นเดียวกับ stdout:

print 'spam'
sys.stdout.write('spam\n')

ตามที่ระบุไว้ในคำตอบอื่น ๆ การพิมพ์นำเสนออินเทอร์เฟซสวยที่มักจะสะดวกกว่า (เช่นสำหรับการพิมพ์ข้อมูล debug) ในขณะที่การเขียนนั้นเร็วกว่าและสะดวกกว่าเมื่อคุณต้องฟอร์แมตผลลัพธ์ในบางวิธี ฉันจะพิจารณาการบำรุงรักษาเช่นกัน:

  1. ในภายหลังคุณสามารถตัดสินใจสลับระหว่าง stdout / stderr และไฟล์ปกติ

  2. ไวยากรณ์print ()มีการเปลี่ยนแปลงใน Python 3 ดังนั้นหากคุณต้องการรองรับทั้งสองเวอร์ชันเขียน ()อาจดีกว่า


4
การใช้from __future__ import print_functionเป็นวิธีที่ดีกว่าในการรองรับทั้ง Python 2.6+ และ Python 3
phoenix

4

ฉันกำลังทำงานในหลาม 3.4.3 ฉันกำลังตัดการพิมพ์เล็กน้อยที่แสดงให้เห็นว่าฉันมาที่นี่ได้อย่างไร:

[18:19 jsilverman@JSILVERMAN-LT7 pexpect]$ python3
>>> import sys
>>> print("testing", file=sys.stderr)
testing
>>>
[18:19 jsilverman@JSILVERMAN-LT7 pexpect]$ 

มันใช้งานได้หรือ ลองเปลี่ยนเส้นทาง stderr ไปที่ไฟล์และดูว่าเกิดอะไรขึ้น:

[18:22 jsilverman@JSILVERMAN-LT7 pexpect]$ python3 2> /tmp/test.txt
>>> import sys
>>> print("testing", file=sys.stderr)
>>> [18:22 jsilverman@JSILVERMAN-LT7 pexpect]$
[18:22 jsilverman@JSILVERMAN-LT7 pexpect]$ cat /tmp/test.txt
Python 3.4.3 (default, May  5 2015, 17:58:45)
[GCC 4.9.2] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
testing

[18:22 jsilverman@JSILVERMAN-LT7 pexpect]$

นอกเหนือจากความจริงที่ว่าการแนะนำเล็กน้อยที่หลามให้คุณได้ถูก slurped เป็น stderr (มันจะไปไหนอีก?) มันทำงานได้


2

หากคุณทำแบบทดสอบง่ายๆ:

import time
import sys

def run1(runs):
    x = 0
    cur = time.time()
    while x < runs:
        x += 1
        print >> sys.stderr, 'X'
    elapsed = (time.time()-cur)
    return elapsed

def run2(runs):
    x = 0
    cur = time.time()
    while x < runs:
        x += 1
        sys.stderr.write('X\n')
        sys.stderr.flush()
    elapsed = (time.time()-cur)
    return elapsed

def compare(runs):
    sum1, sum2 = 0, 0
    x = 0
    while x < runs:
        x += 1
        sum1 += run1(runs)
        sum2 += run2(runs)
    return sum1, sum2

if __name__ == '__main__':
    s1, s2 = compare(1000)
    print "Using (print >> sys.stderr, 'X'): %s" %(s1)
    print "Using (sys.stderr.write('X'),sys.stderr.flush()):%s" %(s2)
    print "Ratio: %f" %(float(s1) / float(s2))

คุณจะพบว่า sys.stderr.write () เร็วขึ้นอย่างสม่ำเสมอ1.81เท่า!


ถ้าฉันทำสิ่งนี้ฉันเห็นความแตกต่างน้อยลง เป็นที่น่าสนใจว่าคำตอบส่วนใหญ่จะไม่สนใจฟังก์ชั่นการพิมพ์ (python 3) ฉันไม่เคยใช้มาก่อน (ความเฉื่อย) แต่คิดว่าฉันจะรันสคริปต์เวลานี้และเพิ่มฟังก์ชั่นการพิมพ์ การเปรียบเทียบโดยตรงของคำสั่งการพิมพ์และฟังก์ชั่นเป็นไปไม่ได้ (นำเข้าจากอนาคตนำไปใช้กับไฟล์ทั้งหมดและมาสก์คำสั่งการพิมพ์) แต่การเขียนโค้ดนี้ใหม่เพื่อใช้ฟังก์ชั่นการพิมพ์แทนคำสั่งที่ฉันเห็น ) ในความโปรดปรานของฟังก์ชั่นการพิมพ์
hamish

1
ผลของการทดสอบนี้ทำให้เข้าใจผิดอย่างใด พิมพ์ 'XXXXXXXXXXXXXXXXXXXX' แทน 'X' และอัตราการลดลงไป1.05 ฉันถือว่าโปรแกรมไพ ธ อนส่วนใหญ่จำเป็นต้องพิมพ์มากกว่าหนึ่งตัวอักษร
ถาม

14
ฉันไม่สนใจเกี่ยวกับประสิทธิภาพสำหรับบางอย่างเช่นคำเตือนการพิมพ์
Wim

ฉันรู้ว่ามันใช้เวลาสักครู่ แต่คุณตอบกลับมาไม่นานหลังจากโพสต์ของฉัน ... ถ้าคุณไม่สนใจเรื่องการแสดงมากกว่าที่ฉันจะแนะนำให้ใช้วิธี pythonic มากกว่านี้ในการใช้ sys.stderr.write ไม่ใช่ WTF?!? อักขระ ">>" หากเนมสเปซ sys.stdout นี้ยาวเกินไปคุณสามารถเปลี่ยนชื่อได้ ... (เช่นจาก sys import stderr เป็น stderr_fh) จากนั้นคุณสามารถทำ stderr_fh.write ("blah")
ThePracticalOne

1
[3/3] แม้ว่ามาตรฐานนี้มีความแม่นยำมากขึ้น แต่ก็ไม่น่ากังวล ดังที่ Knuth เขียนว่า: "โปรแกรมเมอร์เสียเวลาจำนวนมากที่คิดหรือกังวลเกี่ยวกับความเร็วของส่วนที่ไม่สำคัญของโปรแกรมและความพยายามเหล่านี้อย่างมีประสิทธิภาพมีผลกระทบเชิงลบอย่างมากเมื่อพิจารณาการดีบักและบำรุงรักษาเราควรลืมเรื่องเล็ก ๆ ประสิทธิภาพพูดถึง 97% ของเวลา: การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากฐานของความชั่วร้ายทั้งหมด "
Corey Goldberg

1

หากคุณต้องการออกจากโปรแกรมเนื่องจากข้อผิดพลาดร้ายแรงให้ใช้:

sys.exit("Your program caused a fatal error. ... description ...")

และimport sysในส่วนหัว


-2

คำตอบสำหรับคำถามคือ: มีวิธีที่แตกต่างในการพิมพ์ stderr ใน python แต่ขึ้นอยู่กับ 1. ) เราใช้ python เวอร์ชันใด 2. ) เอาต์พุตที่แน่นอนที่เราต้องการ

ความแตกต่างระหว่างฟังก์ชั่นการเขียนของ print และ stderr: stderr : stderr (ข้อผิดพลาดมาตรฐาน) คือไพพ์ที่สร้างขึ้นในทุกระบบ UNIX / Linux เมื่อโปรแกรมของคุณขัดข้องและพิมพ์ข้อมูลการดีบัก (เช่น traceback ใน Python) มันจะไปที่ stderr ท่อ.

print : print เป็น wrapper ที่จัดรูปแบบอินพุต (อินพุตเป็นช่องว่างระหว่างอาร์กิวเมนต์และบรรทัดใหม่ที่ส่วนท้าย) จากนั้นจะเรียกใช้ฟังก์ชันการเขียนของวัตถุที่กำหนดวัตถุที่กำหนดโดยค่าเริ่มต้นคือ sys.stdout แต่เราสามารถ ผ่านไฟล์คือเราสามารถพิมพ์อินพุตในไฟล์ได้

Python2: ถ้าเราใช้ python2 แล้ว

>>> import sys
>>> print "hi"
hi
>>> print("hi")
hi
>>> print >> sys.stderr.write("hi")
hi

เครื่องหมายจุลภาคต่อท้าย Python2 ใน Python3 กลายเป็นพารามิเตอร์ดังนั้นหากเราใช้เครื่องหมายจุลภาคต่อท้ายเพื่อหลีกเลี่ยงการขึ้นบรรทัดใหม่หลังจากการพิมพ์สิ่งนี้ใน Python3 จะดูเหมือนพิมพ์ ('Text to print', end = '') ซึ่งเป็นข้อผิดพลาดทางไวยากรณ์ภายใต้ Python2 .

http://python3porting.com/noconv.html

หากเราตรวจสอบเดียวกันข้างต้น sceario ใน python3:

>>> import sys
>>> print("hi")
hi

ภายใต้ Python 2.6 จะมีการนำเข้าในอนาคตเพื่อพิมพ์ลงในฟังก์ชัน ดังนั้นเพื่อหลีกเลี่ยงข้อผิดพลาดทางไวยากรณ์และความแตกต่างอื่น ๆ เราควรเริ่มไฟล์ใด ๆ ที่เราใช้ print () กับจากprint_function ในอนาคต อนาคตการนำเข้าทำงานเฉพาะภายใต้ Python 2.6 และต่อมาเพื่อให้งูหลาม 2.5 และก่อนหน้านี้คุณมีสองตัวเลือก คุณสามารถแปลงงานพิมพ์ที่ซับซ้อนมากขึ้นเป็นงานที่ง่ายขึ้นหรือคุณสามารถใช้ฟังก์ชั่นการพิมพ์แยกต่างหากที่ทำงานภายใต้ทั้ง Python2 และ Python3

>>> from __future__ import print_function
>>> 
>>> def printex(*args, **kwargs):
...     print(*args, file=sys.stderr, **kwargs)
... 
>>> printex("hii")
hii
>>>

ตัวพิมพ์เล็ก: จุดที่ควรสังเกตว่า sys.stderr.write () หรือ sys.stdout.write () (stdout (เอาต์พุตมาตรฐาน) เป็นไพพ์ที่สร้างขึ้นในทุกระบบ UNIX / Linux) ไม่ใช่การแทนที่สำหรับการพิมพ์ แต่ใช่ เราสามารถใช้มันเป็นทางเลือกในบางกรณี พิมพ์เป็น wrapper ที่ล้อมอินพุตด้วยช่องว่างและขึ้นบรรทัดใหม่ที่ส่วนท้ายและใช้ฟังก์ชันเขียนเพื่อเขียน นี่คือเหตุผลที่ sys.stderr.write () เร็วขึ้น

หมายเหตุ:เราสามารถติดตามและ debugg โดยใช้การบันทึก

#test.py
import logging
logging.info('This is the existing protocol.')
FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
logging.basicConfig(format=FORMAT)
d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
logging.warning("Protocol problem: %s", "connection reset", extra=d)

https://docs.python.org/2/library/logging.html#logger-objects

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.