Выполнение скрипта с использованием альтернативного [дубликата]

Контейнеры Python содержат ссылки на другие объекты. См. Этот пример:

>>> a = []
>>> b = [a]
>>> b
[[]]
>>> a.append(1)
>>> b
[[1]]

В этом b есть список, содержащий один элемент, который является ссылкой на список a. Список a изменен.

Умножение списка на целое эквивалентно добавлению списка к себе несколько раз (см. операции общей последовательности ). Итак, продолжаем с примера:

>>> c = b + b
>>> c
[[1], [1]]
>>>
>>> a[0] = 2
>>> c
[[2], [2]]

Мы видим, что список c теперь содержит две ссылки на список a, который эквивалентен c = b * 2.

Python FAQ также содержит объяснение этого поведения: Как создать многомерный список?

36
задан Robert 10 July 2014 в 15:46
поделиться

2 ответа

Я не знаком с Ansible, но из сообщения об ошибке | фактически передается как аргумент dpkg и не интерпретируется как pipe между процессами. Вероятно, Ansible не выполняет команду через оболочку. Поэтому вы должны явно запросить его.

Я точно не знаю, как это сделать, попробуйте один из них:

command: bash -c "dpkg -l | grep python-apt"

или

command: bash -c 'dpkg -l | grep python-apt'

Если оба отказались, у вас все еще есть возможность поместить команды в сценарий оболочки и использовать этот скрипт в своей команде ...


EDIT: из документа:

Команда

- выполняет команду на удаленном узле

Командный модуль принимает имя команды, за которым следует список аргументов, разделенных пробелами. Данная команда будет выполнена на всех выбранных узлах. Он не будет обрабатываться через оболочку, поэтому переменные типа $ HOME и операции типа «& lt;», «>», «|» и «& amp;» не будет работать (используйте модуль оболочки, если вам нужны эти функции).

shell - выполняет команды в узлах

Модуль оболочки принимает имя команды а затем список аргументов, разделенных пробелами. Это почти так же, как командный модуль, но выполняет команду через оболочку (/ bin / sh) на удаленном узле.

Вам, вероятно, придется использовать shell: dpkg -l | grep python-apt

По-прежнему интересно, работало бы мое первоначальное предположение (bash -c "...") ...

77
ответ дан Sylvain Leroux 20 August 2018 в 20:15
поделиться
  • 1
    Моя ошибка заключалась в том, чтобы использовать команду, а не оболочку. Я также должен игнорировать ошибку в первый раз, а затем, когда пакет python-apt установлен, задача проверки не прерывается. Спасибо. – Robert 11 July 2014 в 14:28
  • 2
    bash -c "работает" – Err0rr 4 April 2018 в 05:34

прочитал о командном модуле в документации Ansible :

Он не будет обрабатываться через оболочку, поэтому ... операции типа «& lt;», > "," | "и" & amp; " не работает

Как рекомендуется, используйте модуль оболочки :

- name: Check if python-apt is installed
  shell: dpkg -l | grep python-apt
  register: python_apt_installed
  ignore_errors: True

Для чего это стоит, вы можете проверить / подтвердить установка в среде debian с использованием команды apt :

- name: ensure python-apt is installed
  apt: name=python-apt state=present
34
ответ дан tedder42 20 August 2018 в 20:15
поделиться
  • 1
    Если я хочу использовать apt-модуль, необходимо установить его первым. Я делаю подтверждение только в первый раз, а позже я использую модуль apt для установки пакетов. Спасибо за ваш ответ. – Robert 11 July 2014 в 14:32
  • 2
    Я думаю, что это лучший подход, используя модули, которые напрямую взаимодействуют с пакетами. – diablinux 11 July 2014 в 14:53
  • 3
    @ rob3 ждать, какое подтверждение? вы можете использовать apt для установки модулей и проверки их установки. И debian, и ubuntu уже есть, и python-apt не имеет никаких ручных этапов установки. – tedder42 11 July 2014 в 17:46
  • 4
    да, но из документации первая заметка гласит: Требуется python-apt . Тогда первая задача - установить python-apt, а затем я могу использовать его для установки других пакетов. – Robert 11 July 2014 в 19:34
  • 5
    @ Rob3 кажется странным, но вы можете использовать apt для установки python-apt. – tedder42 11 July 2014 в 19:53
Другие вопросы по тегам:

Похожие вопросы: