Почему мой модуль Ansible не работает с TypeError: у объекта 'itertools.imap' нет атрибута - PullRequest
0 голосов
/ 19 сентября 2019

Учитывая следующий код Python в моем файле модуля Ansible

def remove_old_plugin_version(data):
    has_changed = False
    glb = os.path.join(os.path.sep,'/opt/sonarqube/sonarque/extensions/plugins/','*.jar') 
    plgns = map(os.path.basename, glob.glob(glb))
    plgn_installed = plgns[0]

Этот код завершается с ошибкой в ​​строке с plgn_installed С сообщением

TypeError: объект 'itertools.imap' имеетбез атрибута ' getitem '

Я могу очень хорошо выполнить этот код при использовании консоли Python

>>> import glob,os
>>> glb = os.path.join(os.path.sep,'/opt/sonarqube/sonarqube/extensions/plugins/','*.jar') 
>>> plgns = map(os.path.basename, glob.glob(glb))
>>> plgn_installed = plgns[0]
>>> plgn_installed
'sonar-build-breaker-plugin-2.2.jar'
>>> 

Почему этот код не работает в модуле Ansible?Как правильно написать код для выполнения Ansible?

В качестве обходного пути я использую

plgns = []
for plgn in map(os.path.basename, glob.glob(glb)):
    plgns.append(plgn)
plgn_installed = plgns[0]

. Ansible версия одинакова в обоих случаях.Python 2.7.15+ Я использую Ansible с Vagrant.Vagrant показывает

sonarqube: Package python-2.7.5-86.el7.x86_64 already installed and latest version

Я запускаю консоль Python на узле Vagrant

[vagrant@sonarqube ~]$ python --version
Python 2.7.5

1 Ответ

0 голосов
/ 19 сентября 2019

В Ansible есть код, который исправляет функцию карты на Python2, чтобы она работала согласованно с Python3, что означает возвращение итератора.

См., Например: Lamba и Map ведут себя по-разному в Ansible 2.2.1.0 # 22877

Проблема в том, что мы делаем следующее в ansible.module_utils.basic:

from ansible.module_utils.six.moves import map, reduce

Это эффективно делает from itertools import imap as map

imap работает аналогично map, однако это итератор, и он не выполняет итерацию сразу в вашем примере, поэтому он никогда ничего не расширяет

Примечание: реальный код выглядит как MovedAttribute("map", "itertools", "builtins", "imap", "map")

В Python3 map возвращает итерацию, ваш исходный код потерпит неудачу, поэтому использование альтернативного способа - хорошая идея, даже если вы все еще на Python 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...