คำตอบสำหรับคำถามคือ: มีวิธีที่แตกต่างในการพิมพ์ 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