如何在Linux终端中抑制Python DeprecationWarnings?

3

我使用 easy_install 安装了 i18ndude(一个用于在 Plone 中进行国际化的实用程序)。

当我尝试在终端上运行实用程序 i18ndude 时,会出现以下情况:

/usr/local/lib/python2.6/dist-packages/i18ndude-3.1.2-py2.6.egg/i18ndude/odict.py:7: DeprecationWarning: object.__init__() takes no parameters
  dict.__init__(self, dict)

我如何在命令行调用工具时抑制这些警告消息?这可能吗?理论上我知道应该安装其他Python解释器,并从那里调用i18ndude,但我想要一个更简单的方法(比如参数之类的东西)。
顺便说一下,我正在使用Plone官方网站上的i18ndude脚本。
4个回答

5

重定向可以使用,但它会抑制发送到该“流”(stream)的所有消息;例如:

i178ndude 2>/dev/null

将流2(通常是程序的stderr,但弃用警告可能会被发送到其他流)发送到空设备。这是“即使你不知道如何修复也要修复”的方法。确实有一个选项-W,可以像这样使用:-W ignore::DeprecationWarning或简单地-W ignore,忽略所有警告。您可以编写一个调用Python解释器运行程序的脚本,或更合理地修改#!,添加类似于#!/usr/bin/env python -W ignore::DeprecationWarning的内容。


1
假设你想要运行名为 X 的 Python 脚本,你可以显式地调用解释器(Python):python -W ignore::DeprecationWarning /path/to/X;其中 /path/to/X 可以替换为 $(which X) - ShinTakezou
问题是我有一个bash脚本(i18ndude.sh),它调用i18ndude。但是i18ndude并不完全是一个Python脚本,我只是通过在终端键入“i18ndude”来调用它,所以我不知道在哪里放置这个调用... - Somebody still uses you MS-DOS
你不能修改bash脚本吗?尝试运行file $(which i18ndude);它应该会“猜测”i18ndude是什么。(所以,你有一个调用python脚本的i18ndude的bash脚本?)(疑问:你知道脚本不需要.sh、.py、.xyz扩展名吗?) - ShinTakezou
i18ndude - "/usr/local/bin/i18ndude: python script text executable"。我有一个bash脚本,我使用"sh i18ndude.sh"来调用它。这个脚本会调用i18ndude。以下是脚本源代码:http://plone.org/documentation/manual/developer-manual/internationalization-i18n-and-localization-l10n/translating-text-in-code/i18ndude - Somebody still uses you MS-DOS
你可以在sh脚本中将每个i18ndude的出现都替换为python -W ignore::DeprecationWarning /path/to/i18ndude,并且/path/to/i18ndude可以放入一个变量中,例如ndude=$(which i18ndude),这样你就可以用$ndude代替/path/to/i18ndude;如果你有权限修改sh脚本,则可以直接修改,否则可以将其复制到bin目录或其他地方,进行修改,然后像这样调用:sh ~/bin/i18ndude.sh。你可以使用chmod +x命令将其设置为可执行文件,并在第一行添加#! /bin/bash,最后将~/bin添加到PATH中,然后可以直接运行myi18ndude.sh(更改名称以避免与i18ndude.sh冲突)。 - ShinTakezou

4
如果作为脚本运行,您可以使用以下方法:
#!/usr/bin/env python -W ignore::DeprecationWarning

3

您可以暂时屏蔽警告

如果您知道使用的代码会引发警告,例如已弃用的函数,但不想看到警告,则可以使用catch_warnings上下文管理器来抑制警告:

import warnings

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

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

在上下文管理器中,所有警告都将被忽略。这使您可以使用已知已弃用的代码而不必看到警告,同时不会抑制其他可能不知道其使用已弃用代码的代码的警告。注意:这只能保证在单线程应用程序中。如果两个或更多线程同时使用catch_warnings上下文管理器,则行为未定义。

我不理解这个解决方案。我应该把这段代码放在哪里?什么是“上下文管理器”?我无法编辑源代码。 - Somebody still uses you MS-DOS
谢谢你的帮助。我已经查阅了Python文档,但这个解决方案并不是我想要的,所以我才问如何在命令行中禁止某些东西。 - Somebody still uses you MS-DOS
1
如果您无法修改源代码,请为您的二进制文件编写一个脚本来调用它,并使用“-W ignore::DeprecationWarning”选项。 - ShinTakezou
我正在尝试从Bash脚本中运行eyed3,以忽略Python警告,但不确定如何在Bash脚本中实现。 - blamb

1

请参见cmdoption-W

-W arg

警告控制。Python的警告机制默认将警告消息打印到sys.stderr。一个典型的警告消息具有以下形式:

文件:行:类别:消息

默认情况下,每个警告在它出现的每个源行中打印一次。此选项控制警告打印的频率。

可以给出多个-W选项;当一个警告与多个选项匹配时,执行最后一个匹配选项的操作。无效的-W选项将被忽略(尽管在发出第一个警告时会打印有关无效选项的警告消息)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接