mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
dconf - Try to find a Python interpreter that has gi.repository.GLib (#6491)
* dconf - Try to find a Python interpreter that has gi.repository.GLib If we're invoked in a Python interpreter that doesn't have access to `gi.repository.GLib`, try to find one that does and respawn the task in that interpreter. * ChangeLog fragment for #6491 * Update changelogs/fragments/6491-dconf-respawn.yml Co-authored-by: Felix Fontein <felix@fontein.de> * Simplify import code * Get rid of ModuleNotFoundError --------- Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
parent
febe7a2fb4
commit
9f3c86a589
2 changed files with 38 additions and 0 deletions
2
changelogs/fragments/6491-dconf-respawn.yml
Normal file
2
changelogs/fragments/6491-dconf-respawn.yml
Normal file
|
@ -0,0 +1,2 @@
|
|||
minor_changes:
|
||||
- dconf - if ``gi.repository.GLib`` is missing, try to respawn in a Python interpreter that has it (https://github.com/ansible-collections/community.general/pull/6491).
|
|
@ -143,11 +143,19 @@ EXAMPLES = r"""
|
|||
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.common.respawn import (
|
||||
has_respawned,
|
||||
probe_interpreters_for_module,
|
||||
respawn_module,
|
||||
)
|
||||
from ansible.module_utils.common.text.converters import to_native
|
||||
from ansible_collections.community.general.plugins.module_utils import deps
|
||||
|
||||
glib_module_name = 'gi.repository.GLib'
|
||||
|
||||
try:
|
||||
from gi.repository.GLib import Variant, GError
|
||||
except ImportError:
|
||||
|
@ -415,6 +423,34 @@ def main():
|
|||
],
|
||||
)
|
||||
|
||||
if Variant is None:
|
||||
# This interpreter can't see the GLib module. To try to fix that, we'll
|
||||
# look in common locations for system-owned interpreters that can see
|
||||
# it; if we find one, we'll respawn under it. Otherwise we'll proceed
|
||||
# with degraded performance, without the ability to parse GVariants.
|
||||
# Later (in a different PR) we'll actually deprecate this degraded
|
||||
# performance level and fail with an error if the library can't be
|
||||
# found.
|
||||
|
||||
if has_respawned():
|
||||
# This shouldn't be possible; short-circuit early if it happens.
|
||||
module.fail_json(
|
||||
msg="%s must be installed and visible from %s." %
|
||||
(glib_module_name, sys.executable))
|
||||
|
||||
interpreters = ['/usr/bin/python3', '/usr/bin/python2',
|
||||
'/usr/bin/python']
|
||||
|
||||
interpreter = probe_interpreters_for_module(
|
||||
interpreters, glib_module_name)
|
||||
|
||||
if interpreter:
|
||||
# Found the Python bindings; respawn this module under the
|
||||
# interpreter where we found them.
|
||||
respawn_module(interpreter)
|
||||
# This is the end of the line for this process, it will exit here
|
||||
# once the respawned module has completed.
|
||||
|
||||
# Try to be forgiving about the user specifying a boolean as the value, or
|
||||
# more accurately about the fact that YAML and Ansible are quite insistent
|
||||
# about converting strings that look like booleans into booleans. Convert
|
||||
|
|
Loading…
Reference in a new issue