วิธีการเพิกเฉยต่อคำเตือนใน Python


176

ฉันได้รับสิ่งนี้:

DeprecationWarning: integer argument expected, got float

ฉันจะทำให้ข้อความนี้หายไปได้อย่างไร มีวิธีหลีกเลี่ยงคำเตือนใน Python หรือไม่?

คำตอบ:


121

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

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

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

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


8
ฉันหวังว่าฉันจะทำงานนี้ ... ฉันได้รับ/usr/bin/env: python -W ignore::DeprecationWarning: No such file or directoryข้อผิดพลาด มันทำงานได้ถ้าฉันใช้ python พร้อมกับ-W ignore::DeprecationWarningตัวเลือกใน command-line, แต่ / usr / bin / env ไม่ได้จัดการมัน
weronika

4
ดูเหมือนว่าจะเป็นทางออกของ windows เท่านั้น
Daniel Miles

15
คุณสามารถตั้งค่าตัวแปร env PYTHONWARNINGS สิ่งนี้ทำงานให้ฉันexport PYTHONWARNINGS="ignore::DeprecationWarning:simplejson"เพื่อปิดการใช้งาน django json คำเตือน deprication จาก sorl
yvess

@ yess ถ้าเป็นคำตอบฉันจะลงคะแนนให้ ดูเหมือนจะเป็นวิธีที่สะอาดในการเพิกเฉยต่อคำเตือนที่เฉพาะเจาะจงทั้งระบบ ฉันใส่มันลงใน ~ / .profile ใช้งานได้ดี
allanberry

สวัสดีเราทราบได้ไหมว่าจะเปลี่ยนข้อความเตือนการคัดค้านนี้เป็นข้อความที่มีข้อมูลประเภทใด สิ่งที่ฉันต้องการก็คือการแสดงข้อความบนคอนโซลไม่ให้จัดหมวดหมู่เป็นคำเตือนใด ๆ
กฤษณะ Oza

194

คุณควรแก้ไขรหัสของคุณ แต่ในกรณี

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

2
ทำงานให้ฉันโดยใช้ iPython
zbinsd

21
มันไม่ได้ผลสำหรับฉันเลย แต่ก็ยังเห็นการเสื่อมราคา
user1244215

8
@ user1244215 ฉันอาจจะผิด warnings.filterwarnings("ignore", category=DeprecationWarning)แต่ฉันคิดว่ามันเป็นเรื่องสำคัญที่ในรหัสของคุณที่คุณเรียก ฉันคิดว่าคุณต้องเรียกใช้สิ่งนี้หลังจากที่คุณนำเข้าห้องสมุดที่คายคำเตือนออกมา
Jack Kelly

1
@CodingYourLife หมวดหมู่เป็นสิ่งที่จำเป็นดังนั้นคุณจะยังคงเห็นคำเตือนประเภทอื่น ๆ เช่น RuntimeWarning เป็นต้น
ismail

1
from xgboost import XGBClassifierในกรณีของฉันรหัสที่ก่อให้เกิดการเตือนเป็น ฉันต้องใส่warnings.filterwarnings("ignore", category=DeprecationWarning)ทันทีก่อนที่การนำเข้าจะทำงาน
sedeh

193

ฉันมีสิ่งเหล่านี้:

/home/eddyp/virtualenv/lib/python2.6/site-packages/Twisted-8.2.0-py2.6-linux-x86_64.egg/twisted/persisted/sob.py:12:
DeprecationWarning: the md5 module is deprecated; use hashlib instead import os, md5, sys

/home/eddyp/virtualenv/lib/python2.6/site-packages/Twisted-8.2.0-py2.6-linux-x86_64.egg/twisted/python/filepath.py:12:
DeprecationWarning: the sha module is deprecated; use the hashlib module instead import sha

แก้ไขด้วย:

import warnings

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

yourcode()

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

import md5, sha

2
เยี่ยมมากขอบคุณมาก !! (ใช้เวลาสักครู่ที่ฉันจะรู้ว่าฉันสามารถห่อโค้ดที่ไม่นำเข้าได้ในแพคเกจนี้เนื่องจากบางแพ็คเกจสร้าง DeprecationWarnings เมื่อใช้หลังจากนำเข้า) วิธีที่ดีมากที่จะเงียบเฉพาะ DeprecationWarnings ที่ฉันได้ดูและตัดสินใจแล้ว ฉันต้องการที่จะไม่สนใจ
weronika

29

ฉันพบวิธีที่สะอาดที่สุดในการทำเช่นนี้ (โดยเฉพาะบน windows) คือการเพิ่มสิ่งต่อไปนี้ใน C: \ Python26 \ Lib \ site-packages \ sitecustomize.py:

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

โปรดทราบว่าฉันต้องสร้างไฟล์นี้ แน่นอนเปลี่ยนเส้นทางเป็นงูหลามหากคุณแตกต่าง


26

ไม่มีคำตอบใดที่เหมาะกับฉันดังนั้นฉันจะโพสต์วิธีแก้ไขปัญหานี้ ฉันใช้at the beginning of my main.pyสคริปต์ต่อไปนี้และทำงานได้ดี


ใช้สิ่งต่อไปนี้ตามที่เป็นอยู่ (คัดลอกวาง):

def warn(*args, **kwargs):
    pass
import warnings
warnings.warn = warn

ตัวอย่าง:

import "blabla"
import "blabla"

def warn(*args, **kwargs):
    pass
import warnings
warnings.warn = warn

# more code here...
# more code here...


4
สิ่งนี้ใช้ได้ผลเมื่อโซลูชันอื่นทั้งหมดไม่ทำงาน ขอบคุณ!
cxxl

สิ่งนี้ช่วยฉันด้วย ดีใจที่ฉันช่วยได้
seralouk

ไม่ทำงานใน 3.7.3 สำหรับคำเตือนการคัดค้าน AstroPy :(
เข้าที่

ทำงานให้ฉันขอบคุณ :)
valkyrie55

ข่าวดี ! ไชโย
seralouk

6

ผ่านการขัดแย้งที่ถูกต้อง? : P

ในบันทึกที่ร้ายแรงยิ่งขึ้นคุณสามารถส่งผ่านอาร์กิวเมนต์ -Wi :: DeprecationWarning บนบรรทัดคำสั่งไปยังล่ามเพื่อละเว้นคำเตือนการคัดค้าน


5

โซลูชันนักเทียบท่า

  • ปิดใช้งานคำเตือนทั้งหมดก่อนเรียกใช้แอปพลิเคชันหลาม
    • คุณสามารถปิดการใช้งานการทดสอบการเทียบเคียงของคุณได้เช่นกัน
ENV PYTHONWARNINGS="ignore::DeprecationWarning"


4

เมื่อคุณต้องการละเว้นคำเตือนเฉพาะในฟังก์ชั่นคุณสามารถทำสิ่งต่อไปนี้

import warnings
from functools import wraps


def ignore_warnings(f):
    @wraps(f)
    def inner(*args, **kwargs):
        with warnings.catch_warnings(record=True) as w:
            warnings.simplefilter("ignore")
            response = f(*args, **kwargs)
        return response
    return inner

@ignore_warnings
def foo(arg1, arg2):
    ...
    write your code here without warnings
    ...

@ignore_warnings
def foo2(arg1, arg2, arg3):
    ...
    write your code here without warnings
    ...

เพียงเพิ่ม @ignore_warnings มัณฑนากรบนฟังก์ชันที่คุณต้องการละเว้นคำเตือนทั้งหมด


3

ลองใช้รหัสด้านล่างหากคุณใช้ Python3:

import sys

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

หรือลองสิ่งนี้ ...

import warnings

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

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

หรือลองสิ่งนี้ ...

import warnings
warnings.filterwarnings("ignore")

2

Python 3

เพียงเขียนบรรทัดด้านล่างที่จำง่ายก่อนเขียนรหัสของคุณ:

import warnings

warnings.filterwarnings("ignore")

0

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


0

สำหรับ python 3 เพียงแค่เขียนรหัสด้านล่างเพื่อละเว้นคำเตือนทั้งหมด

from warnings import filterwarnings
filterwarnings("ignore")

-2

เพื่อไม่ให้เอาชนะคุณ แต่คุณถูกเตือนว่าสิ่งที่คุณกำลังทำอยู่มีแนวโน้มที่จะหยุดทำงานเมื่อคุณอัพเกรด python ครั้งต่อไป แปลงเป็น int และทำได้ด้วย

BTW คุณยังสามารถเขียนตัวจัดการคำเตือนของคุณเอง เพียงแค่กำหนดฟังก์ชั่นที่ไม่ทำอะไรเลย วิธีการเปลี่ยนเส้นทางคำเตือนหลามไปยังกระแสที่กำหนดเอง?


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