如何在Python模块CppHeaderParser中抑制警告

时间:2017-06-22 12:47:27

标签: python python-3.x

如何更改外部模块中变量或函数的值?

我有一个需要解析的C ++头文件。我正在使用CppHeaderParser。可悲的是,标题会产生很多我想要压制的警告。有问题的标题是由其他人维护的,所以我无法修复它并完成。

CppHeaderParser不包含可配置方式来抑制警告,但它由模块中的变量和函数控制

# Controls warning_print
print_warnings = 1

...

def warning_print(arg):
    if print_warnings: print(("[%4d] %s"%(inspect.currentframe().f_back.f_lineno, arg)))

在我的脚本中,我尝试更改print_warnings

的值
import CppHeaderParser
CppHeaderParser.print_warnings = 0
cpp_info = CppHeaderParser.CppHeader(my_h_file)

但这没有效果。 如何在不同的模块中设置变量,以便该模块中定义的类可以看到它?

在我的情况下,我可能还想重新定义warning_print以检查警告并仅跳过我想忽略的特定警告。我遇到了与设置print_warnings相同的问题。任务"工作"但没有效果,好像CppHeaderParser中的代码没有查看我设置的值。

注意:我通过制作头文件的临时副本来解决问题,纠正问题,但我认为这是一个脆弱的解决方案。

更新:我能够完全无情地压制所有警告:

CppHeaderParser.CppHeaderParser.print_warnings = 0

2 个答案:

答案 0 :(得分:2)

我看过来源了。您的方法的问题是在CppHeaderParser文件中有导入*:

from .CppHeaderParser import *

所以你需要改变导入CppHeaderParser类的方式:

from CppHeaderParser import CppHeaderParser 

它应该有用。

最后,试试这个:

from CppHeaderParser import CppHeaderParser
CppHeaderParser.print_warnings = 0
cpp_info = CppHeaderParser.CppHeader(my_h_file)

此类行为的原因是from语句从导入的模块创建变量副本,但不创建别名。我将尝试用一个简单的例子来解释它。假设我们有一个名为import_test的模块,其中包含以下内容:

foo = "Init value"

def f():
    print(foo)

然后执行以下代码:

>> from import_test import *
>> f()
Init value
>> foo = "Updated value"
>> f()
Init value

原因是您更改了变量foo的副本,因此import_test.foo变量的实际值不会更改。

但是当我们导入模块本身时,我们有不同的行为:

>> import import_test
>> import_test.f()
Init value
>> import_test.foo = "Updated value"
>> import_test.f()
Updated value

因此,当您CppHeaderParser import CppHeaderParser包时,CppHeaderParser.__init__内的代码将被执行。 python解释器在CppHeaderParser中创建warnings_print变量的副本。但是要更改print_warning函数的行为,您必须更改CppHeaderParser.CppHeaderParser.warnings_print的值。

答案 1 :(得分:0)

尝试修补猴子:

import CppHeaderParser

def my_silent_warning_print(arg):
    pass

CppHeaderParser.warning_print = my_silent_warning_print