как я могу запустить / отладить Ansible playbooks внутри IDE (PyCharm)?

Проблема с вашим кодом заключается в том, что вы изменяете grid по мере продвижения. Таким образом, для каждой ячейки вы используете входные значения для соседних с нисходящими / правыми соседями, но выходные значения для соседних со старшим / левым.

Итак, для данного примера, когда вы вычисляете соседи grid[1][0], вы уже заменили двух соседей, grid[0][0] и grid[0][1], поэтому они теперь 4, 4 вместо 2, 3. Это означает, что вы усредняете 4, 4, 5, 6, 8, 9 вместо 2, 3, 5, 6, 8, 9. Итак, вместо того, чтобы получить 5.5, что вы округлите до 5, вы получите 6.0, который округляется до 6.


Самое простое решение - просто создать новую выходную сетку по мере того, как вы идете а затем верните это:

    rows, cols = len(grid), len(grid[0])
    outgrid = []
    #Go through each cell 
    for r in range(rows):
        outrow = []
        for c in range(cols):
            # … same code as before, but instead of the grid[r][c] =
            outrow.append(int(total/n))
        outgrid.append(outrow)
    return outgrid

Если вам нужно изменить сетку на месте, вы можете вместо этого скопировать исходную сетку и выполнить итерацию по этой копии:

    rows, cols = len(grid), len(grid[0])
    ingrid = [list(row) for row in grid]
    #Go through each cell 
    for r in range(rows):
        for c in range(cols):
            # … same code as before, but instead of total += grid[r+ri][c+ci]
            total += ingrid[r+ri][c+ci]

Если вы использовали массив 2D NumPy вместо списка списков, вы могли бы решить это на более высоком уровне.

NumPy позволяет добавлять все массивы все сразу разделите их на скаляры и т. д., чтобы вы могли избавиться от этих циклов над r и c и просто выполнять всю работу в массиве. Но вы все равно должны думать о своих границах. Вы не можете просто добавить arr и arr[:-1] и arr[1:] и т. Д., Вам нужно выставить их на один размер. И если вы просто набрали 0 с, вы закончите усреднение 0, 4, 4, 0, 5, 6, 0, 8, 9, что не хорошо. Но если вы набиваете их значениями NaN, вы усредняете NaN, 4, 4, NaN, 5, 6, NaN, 8, 9, тогда вы можете использовать функцию nanmean , которая игнорирует значения NaN и усредняет 6 действительных значений .

Итак, это все еще несколько строк кода для итерации по 9 направлениям, поместите 9 массивов и nanmean результаты. (Или вы могли бы втиснуть его в гигантское выражение с помощью product, как и ответ на ярлык, но это не совсем читаемо или легче понять.)

Но если вы можете перетащить SciPy , набор алгоритмов почти для всего, что вы хотели бы построить поверх NumPy, имеет функцию в своей библиотеке ndimage под названием generic_filter , которые могут делать все возможные вариации «собрать N соседей, заполнить, как X, и запустить функцию Y на результирующих массивах».

В нашем случае мы хотим собрать 3- соседей по оси, площадку с постоянным значением NaN и запустить функцию nanmean, поэтому этот однострочный файл сделает все, что вам нужно :

scipy.ndimage.generic_filter(grid, function=np.nanmean, size=3, mode='constant', cval=np.NaN)

0
задан Alex Woolford 18 January 2019 в 23:41
поделиться

1 ответ

  1. Установите ansible в свой virtualenv или иным образом сделайте так, чтобы PyCharm мог видеть файл ansible в bin; К сожалению, поскольку у них 164 строки Python вместо просто __main__, вы не можете вызывать его как python -m ansible.cli.playbook или любая такая тонкость
  2. создает конфигурацию запуска с «Python Script» указывая на .../bin/ansible или .../bin/ansible-playbook и т. д.

    Для вашего удобства вы также можете открыть bin/ansible в PyCharm, перейти к строке if __name__ и нажать «треугольник игры» в левом желобе. , хотя это приведет к запуску процесса python в каталоге bin, что может раздражать

  3. установить точку останова в выбранном вами файле ansible
  4. запустите отладчик

Имейте в виду, что в группе дел ANSIBLE собирается выложить что-то для выполнения, и, насколько мне известно, отладчик PyCharm не следует за подпроцессом или его друзей, так что вам придется перепрыгивать через некоторые обручи, если вы хотите иметь возможность отлаживать модули этого стиля, включая любой из ваших собственных сценариев в library/*.py или что-то еще.

Я очень люблю PyCharm, но в этом конкретном случае вы можете быть более счастливы, используя strategy: debug в своей книге игр и сражаясь с отладчиком ansible

0
ответ дан Mxx 18 January 2019 в 23:41
поделиться
Другие вопросы по тегам:

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