วิธีปิดการใช้งานคำเตือนของหลาม


420

ฉันกำลังทำงานกับโค้ดที่ส่งคำเตือนที่ไร้ประโยชน์มากมาย (สำหรับฉันในขณะนี้) โดยใช้warningsห้องสมุด การอ่าน (/ สแกน) เอกสารฉันพบวิธีปิดการเตือนสำหรับฟังก์ชั่นเดียวเท่านั้น แต่ฉันไม่ต้องการเปลี่ยนรหัสมากนัก

มีธงpython -no-warning foo.pyไหม

คุณจะแนะนำอะไร


9
@MartinSamson ฉันเห็นด้วยโดยทั่วไป แต่มีบางกรณีที่ถูกต้องตามกฎหมายสำหรับการเพิกเฉยคำเตือน ฉันได้รับหลายเหล่านี้จากการใช้ไวยากรณ์ที่ถูกต้องใน Xpath FutureWarning: This search is broken in 1.3 and earlier, and will be fixed in a future version. If you rely on the current behaviour, change it to [this other thing]defusedxml: ฉันอยากจะเพิกเฉยต่อคำเตือนตอนนี้และรอให้มันเงียบกว่าการเขียนโค้ดที่น่าเกลียดโดยไม่จำเป็นเพียงเพื่อหลีกเลี่ยงการเตือนที่ไม่เป็นอันตราย
Pedro

1
ปิดการใช้งานคำเตือนเฉพาะ: stackoverflow.com/questions/9134795/…
3226167

คำตอบ:


397

มีเป็นตัวเลือก -W

python -W ignore foo.py


7
ไม่ทำงานบน Ubuntu
parsecer

1
คุณแน่ใจไหม ? มันใช้งานได้สำหรับฉันบนเซิร์ฟเวอร์ ubuntu 18.04 ใช้ python 3.5 btw
Florent F

576

คุณดูที่ส่วนคำเตือนการปราบปรามของเอกสารหลามหรือไม่

หากคุณกำลังใช้รหัสที่คุณรู้ว่าจะเพิ่มคำเตือนเช่นฟังก์ชั่นที่เลิกใช้แล้ว แต่ไม่ต้องการเห็นคำเตือนคุณสามารถระงับคำเตือนได้โดยใช้ catch_warnings context manager:

import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    fxn()

ฉันไม่เอาผิด แต่คุณสามารถระงับคำเตือนทั้งหมดนี้ได้:

import warnings
warnings.filterwarnings("ignore")

Ex:

>>> import warnings
>>> def f():
...  print('before')
...  warnings.warn('you are warned!')
...  print('after')
>>> f()
before
__main__:3: UserWarning: you are warned!
after
>>> warnings.filterwarnings("ignore")
>>> f()
before
after

12
@Framester - ใช่ IMO นี่เป็นวิธีที่ดีที่สุดในการระงับคำเตือนบางคำเตือนโดยทั่วไปเพราะมีบางอย่างผิดปกติดังนั้นการระงับคำเตือนทั้งหมดผ่านทางบรรทัดคำสั่งอาจไม่ใช่วิธีที่ดีที่สุด
Mike

1
@Framester - ฉันแสดงรายการตัวเลือกอื่นด้วยตัวอย่างเช่น ... ฉันไม่ชอบมันมาก (ด้วยเหตุผลที่ฉันให้ไว้ในความคิดเห็นก่อนหน้า) แต่อย่างน้อยตอนนี้คุณมีเครื่องมือ
Mike

41
ถ้าคุณคาดหวังเดียวที่จะจับคำเตือนจากหมวดสินค้าเฉพาะคุณสามารถส่งผ่านได้โดยใช้categoryอาร์กิวเมนต์:warnings.filterwarnings("ignore", category=DeprecationWarning)
ostrokach

1
สิ่งนี้มีประโยชน์สำหรับฉันในกรณีนี้เนื่องจาก html5lib แยกคำเตือน lxml ออกแม้ว่าจะไม่ได้แยกวิเคราะห์ xml ขอบคุณ
jamescampbell

5
นอกจากนี้ยังมีพารามิเตอร์ที่มีประโยชน์สำหรับฟังก์ชั่น:warnings.filterwarnings moduleช่วยให้คุณสามารถละเว้นคำเตือนจากโมดูลที่ระบุ
ชื่อผู้ใช้

104

นอกจากนี้คุณยังสามารถกำหนดตัวแปรสภาพแวดล้อม (คุณสมบัติใหม่ในปี 2010 - เช่น python 2.7)

export PYTHONWARNINGS="ignore"

ทดสอบเช่นนี้: ค่าเริ่มต้น

$ export PYTHONWARNINGS="default"
$ python
>>> import warnings
>>> warnings.warn('my warning')
__main__:1: UserWarning: my warning
>>>

ละเว้นคำเตือน

$ export PYTHONWARNINGS="ignore"
$ python
>>> import warnings
>>> warnings.warn('my warning')
>>> 

สำหรับคำเตือนการคัดค้านมีให้ดูที่วิธีการละเว้นการคัดค้านคำเตือนในงูหลาม

คัดลอกมาที่นี่ ...

จากเอกสารของwarningsโมดูล :

 #!/usr/bin/env python -W ignore::DeprecationWarning

หากคุณใช้ Windows ให้ส่งรหัสผ่าน-W ignore::DeprecationWarningเป็น Python ดีกว่าแม้ว่าจะแก้ปัญหาได้โดยการหล่อเพื่อint

(โปรดทราบว่าใน Python 3.2 คำเตือนการเลิกใช้จะถูกละเว้นโดยค่าเริ่มต้น)

หรือ:

import warnings

with warnings.catch_warnings():
    warnings.filterwarnings("ignore", category=DeprecationWarning)
    import md5, sha

yourcode()

ตอนนี้คุณยังคงได้รับDeprecationWarnings อื่น ๆ ทั้งหมดแต่ไม่ใช่สิ่งที่เกิดจาก:

import md5, sha

2
สิ่งนี้มีประโยชน์อย่างยิ่งในการเพิกเฉยคำเตือนเมื่อทำการทดสอบ การใช้การtoxเพิ่มPYTHONWARNINGS=ignoreเพื่อsetenvทำให้เอาต์พุตสกปรกน้อยลง
Kurt Bourbaki

2
มีประโยชน์มากสำหรับ AWS CLI เช่นกัน
mckenzm

1
แต่สิ่งนี้จะไม่เพิกเฉยต่อคำเตือนการคัดค้าน ฉันขอวิธีรวมได้ไหม
Wey Shi


70

นี่เป็นคำถามเก่า แต่มีคำแนะนำที่ใหม่กว่าในPEP 565ที่จะปิดคำเตือนทั้งหมดหากคุณเขียนแอปพลิเคชันหลามที่คุณควรใช้:

import sys
import warnings

if not sys.warnoptions:
    warnings.simplefilter("ignore")

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


นี่คือที่สมบูรณ์แบบเพราะมันจะไม่ปิดการใช้งานคำเตือนทั้งหมดในการดำเนินการในภายหลัง
Orsiris de Jong

52

หากคุณไม่ต้องการสิ่งที่ซับซ้อนแล้ว:

import warnings
warnings.filterwarnings("ignore", category=FutureWarning)

10
และเพื่อเปลี่ยนสิ่งต่าง ๆ ให้กลับไปสู่พฤติกรรมเริ่มต้น:warnings.filterwarnings("default", category=FutureWarning)
Hans Bouwmeester

17

หากคุณรู้ว่าคำเตือนไร้ประโยชน์ที่คุณมักพบคืออะไรคุณสามารถกรองคำเตือนเหล่านั้นด้วยข้อความ

import warnings

#ignore by message
warnings.filterwarnings("ignore", message="divide by zero encountered in divide")

#part of the message is also okay
warnings.filterwarnings("ignore", message="divide by zero encountered") 
warnings.filterwarnings("ignore", message="invalid value encountered")

0

ฉันรู้ว่านี่ใช้ได้เฉพาะกับสถานการณ์เฉพาะ แต่ในnumpyบริบทที่ฉันชอบใช้np.errstate:

np.sqrt(-1)
__main__:1: RuntimeWarning: invalid value encountered in sqrt
nan

อย่างไรก็ตามการใช้np.errstate:

with np.errstate(invalid='ignore'):
    np.sqrt(-1)
nan

ส่วนที่ดีที่สุดคือคุณสามารถใช้สิ่งนี้กับบรรทัดของรหัสที่เฉพาะเจาะจงเท่านั้น


-5

คำเตือนส่งออกผ่านทาง stderr และทางออกที่ง่ายคือการผนวก '2> / dev / null' เพื่อ CLI สิ่งนี้ทำให้ผู้ใช้หลายคนมีความรู้สึกอย่างมากเช่นผู้ที่มี CentOS 6 ซึ่งติดอยู่กับการอ้างอิงของ python 2.6 (เช่น yum) และโมดูลต่าง ๆ ถูกผลักไปสู่การสูญพันธุ์ในขอบเขตการรายงานข่าว

นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับการเข้ารหัสที่เกี่ยวข้องกับ SNI และอื่น ๆ สามารถอัปเดต 2.6 สำหรับการจัดการ HTTPS โดยใช้ proc ที่: https://urllib3.readthedocs.io/th/latest/user-guide.html#ssl-py2

คำเตือนยังอยู่ในตำแหน่ง แต่ทุกสิ่งที่คุณต้องการจะกลับพอร์ต re-direct ของ stderr จะทำให้คุณมีเอาต์พุตเทอร์มินัล / เชลล์ที่สะอาดแม้ว่าเนื้อหา stdout เองจะไม่เปลี่ยนแปลง

ตอบสนองต่อ FriendFX ประโยคหนึ่ง (1) ตอบสนองโดยตรงกับปัญหาด้วยวิธีการแก้ปัญหาสากล ประโยคที่สอง (2) คำนึงถึงจุดยึดที่อ้างถึง 'ปิดใช้งานคำเตือน' ซึ่งเป็นไพ ธ อน 2.6 โดยเฉพาะและบันทึกว่าผู้ใช้ RHEL / centos 6 ไม่สามารถทำได้โดยตรงหากไม่มี 2.6 แม้ว่าจะไม่มีคำเตือนที่เฉพาะเจาะจงถูกอ้างถึง แต่สอง (2) ตอบคำถาม 2.6 ที่ฉันได้รับบ่อยที่สุดในโมดูลการเข้ารหัสสั้นและวิธีที่ "ทันสมัย" (เช่นอัปเกรด backport แก้ไข) ประสิทธิภาพของ python HTTPS / TLS . para สาม (3) เพียงอธิบายผลลัพธ์ของการใช้ re-direct และอัพเกรดโมดูล / การพึ่งพา


4
ขอบคุณที่สละเวลาตอบ โปรดรักษาคำตอบไว้อย่างเคร่งครัดในหัวข้อ: คุณพูดถึงบางสิ่งที่ไม่เกี่ยวข้องกับคำถามที่เป็นอยู่ในปัจจุบันเช่น CentOS, Python 2.6, การเข้ารหัส, urllib, back-porting คุณสามารถแก้ไขคำถามของคุณเพื่อลบบิตเหล่านั้น หากคุณต้องการทราบรายละเอียดเพิ่มเติมจาก OP ให้แสดงความคิดเห็นภายใต้คำถามแทน
FriendFX
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.