Skip to main content
 首页 » 编程设计

python之使用方法失败; 'module' 对象没有属性 'dumps'

2025年05月04日23bhlsheji

作为evidenced here ,我注意到 Ansible 中有一个奇怪的新行为。

我有an Ansible role named "degoss"安装 Goss连同一些测试文件到系统,执行测试,然后删除它们的所有痕迹。我正在使用 a callback plugin格式化输出和 a custom module调用高斯。

当测试失败时,在较新版本的 Ansible(据我所知约为 2.3)中,我没有得到合理的输出,而是收到以下不直观的错误消息,并且我的插件没有任何输出:

[WARNING]: Failure using method (v2_runner_on_failed) in callback plugin 
(<ansible.plugins.callback.default.CallbackModule object at 0x7fb5e92efd50>): 
'module' object has no attribute 'dumps' 

现在,当我搜索 ansible.plugins.callback.default.CallbackModule 时,我没有看到任何 dumps 的调用。当我搜索 ansible.plugins.callback.CallbackBase ,我确实看到了三个转储调用。在我自己的回调插件和自定义模块中,我有 try/except block 包装我对 json.dumps 的所有调用。

更糟糕的是,我似乎无法始终如一地重现该问题。我无法在本地复制它,它只在任务失败时出现。我的成功/失败逻辑如下:

succeed(module, **result) if rc == 0 else fail( 
    module, "Goss Tests Failed.", **result 
) 

我的succeed/fail 方法定义如下:

def succeed(module, **kwargs): 
    module.exit_json(changed=False, failed=False, goss_failed=False, **kwargs) 
 
def fail(module, message, **kwargs): 
    module.fail_json(msg=message, failed=True, goss_failed=True, **kwargs) 

有什么想法吗?

请您参考如下方法:

这是一个猜测: ansible 的 callback plugin loader在 ansible.plugins.callback 中创建一个模块,它恰好也包含一个 json module .当你的回调插件 imports json你得到 ansible.plugins.callback.json,它不包含 dumps。您可以通过将 from __future__ import absolute_import 添加到您的插件来解决此问题。

您无法重现它的原因可能是您在本地使用 Python 3,它默认为绝对导入。