静音 music21 警告

Silence music21 warnings

我收到大量关于零时值和弦的 music21 警告:

WARNING: midi chord with zero duration will be treated as grace

我尝试用以下内容覆盖 music21.environment.Environment() 上的 warn 方法:

def silence(*args, **kwargs): pass
e = music21.environment.Environment()
setattr(e, 'warn', silence)

我也试过关闭所有警告:

import warnings
warnings.filterwarnings('ignore')

两者都没有成功。我怎样才能使来自 music21 的这些(或理想情况下,所有)警告静音? (我验证了我的数据 post-processing。)

如果您正在使用 ipython,您可以尝试将要执行的部分静音:

from IPython.utils import io

with io.capture_output():
    < ...your code... >

否则,在源代码 (~/Lib/site-packages/music21) 中,您可以导航到 midi/translate.py 并使用注释块或类似内容调整第 585-6 行以禁用警告。

第三个选项可能是创建一个上下文管理器来静音打印,类似于 io.capture_output() 函数:

import io
import sys

class MuteWarn:
    def __enter__(self):
        self._init_stdout = sys.stdout
        sys.stdout = open(os.devnull, "w")
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        sys.stdout.close()
        sys.stdout = self._init_stdout

with MuteWarn():
    < ...your code... >

尝试:

>>> from music21 import midi  # or your standard import
>>> def noop(input):
...   pass
... 
>>> midi.translate.environLocal.warn = noop

我们正在跟踪将警告系统移至 https://github.com/cuthbertLab/music21/issues/254 的 python 警告模块的现代化请求,以便您可以按惯用方式进行过滤。你在这里介绍的案例比 IMO 票上的原始案例更紧迫一些,所以我会发表评论。