【问题标题】:How do you suppress Python DeprecationWarnings on Linux Terminal?你如何在 Linux 终端上抑制 Python DeprecationWarnings?
【发布时间】:2010-06-17 16:03:27
【问题描述】:

我使用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 official sitei18ndude 脚本。

【问题讨论】:

    标签: python linux warnings deprecated


    【解决方案1】:

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

    i178ndude 2>/dev/null

    将流 2 发送到空设备(通常是程序的标准错误,但可以将弃用警告发送到其他流)。这是“即使您不知道如何修复它”的修复方法。确实有一个选项 -W 可以像这样使用:-W ignore::DeprecationWarning 或简单的 -W ignore 忽略所有警告。您可以编写一个脚本,在您的程序上调用 python 解释器,或者更合乎逻辑地修改 prog 的 #! 类似 #!/usr/bin/env python -W ignore::DeprecationWarning

    【讨论】:

    • X是你感兴趣的python脚本的名字,你可以显式调用解释器(python):python -W ignore::DeprecationWarning /path/to/X; /path/to/X 可以改成$(which X)
    • 问题是我有一个调用 i18ndude 的 bash 脚本 (i18ndude.sh)。但是 i18ndude 并不是一个 Python 脚本,我只是从终端输入“i18ndude”来调用它,所以我不知道在哪里调用...
    • 你不能修改 bash 脚本?试试file $(which i18ndude);它应该尝试“猜测” i18ndude 是什么。 (所以,你有一个调用 i18ndude 的 bash 脚本调用一个 python 脚本?)。 (怀疑:你知道脚本不需要 .sh、.py、.xyz 扩展名吗?)
    • i18ndude -“/usr/local/bin/i18ndude:python 脚本文本可执行文件”。我有一个 bash 脚本,我使用“sh i18ndude.sh”来调用它。该脚本调用 i18ndude。这是脚本来源:plone.org/documentation/manual/developer-manual/…
    • 然后你可以在 sh 脚本中更改每次出现的 i18ndude 和 python -W ignore::DeprecationWarning /path/to/i18ndude,并且 /path/to/i18ndude 可以放入一个 var 中,例如 ndude=$(which i18ndude) and so instead of /path/toi18ndude you write $ndude; if you can modify the sh script; otherwise, copy it in your bin or whereever you want, modify it and then call it like sh ~ /bin/i18ndude.sh` 或类似的;你可以chmod +x它,将#! /bin/bash作为第一行,最后将~/bin添加到PATH,然后直接使用myi18ndude.sh运行(更改名称以避免与i18ndude.sh冲突)。
    【解决方案2】:

    如果作为脚本运行,您可以使用:

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

    【讨论】:

      【解决方案3】:

      你可以temporarily suppress warnings:

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

      import warnings
      
      def fxn():
          warnings.warn("deprecated", DeprecationWarning)
      
      with warnings.catch_warnings():
          warnings.simplefilter("ignore")
          fxn()
      

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

      【讨论】:

      • 我不明白这个解决方案。我应该把这段代码放在哪里?什么是“上下文管理器”?我无法编辑来源。
      • 谢谢。我搜索了 python 文档,但这个解决方案不是我想要的,这就是为什么我问如何在命令行上抑制某些东西。
      • 如果您无法修改源,请为您的 bin 编写一个调用它的脚本并使用 -W ignore::DeprecationWarning 选项。
      • 我试图从 bash 脚本运行 eyed3,以忽略 python 警告,不知道如何在 bash 脚本中执行此操作
      【解决方案4】:

      cmdoption-W:

      -W arg

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

      文件:行:类别:消息

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-30
        • 1970-01-01
        • 1970-01-01
        • 2020-01-08
        • 2018-09-23
        • 2015-08-03
        • 2019-11-12
        • 1970-01-01
        相关资源
        最近更新 更多