Как передать список строк внешней команде в Python? - PullRequest
0 голосов
/ 31 октября 2018

Я пишу программу на Python, которая загружает список неверных IP-адресов и добавляет / удаляет их из таблицы в OpenBSD pf. Программа загружает список, форматирует их (как объекты IP-адреса) и передает их команде pfctl. Прямо сейчас у меня это работает как цикл, который вызывает pfctl один раз для каждой строки, таким образом:

for item in addedlist:
    subprocess.run(['pfctl', '-t', const.PF_LISTNAME, '-T', 'add',\
    str(item)], check=True, stderr=subprocess.DEVNULL)

for item in deletedlist:
    subprocess.run(['pfctl', '-t', const.PF_LISTNAME, '-T', 'delete',\
    str(item)], check=True, stderr=subprocess.DEVNULL)

где:

addedlist и deletedlist - это отформатированные списки объектов IP-адресов, которые должны быть добавлены и удалены соответственно.

Я хотел бы выполнить команду pfctl только один раз для каждого списка и передать addedlist и deletedlist команде за один снимок, поскольку списки ( кашель IPv6 * кашель *) могут быть довольно длинным Однако, когда я пытаюсь это сделать, Python жалуется, что не ожидает списка.

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 31 октября 2018

Вам придется объединить item s со списком аргументов, а не вкладывать в него списки items.

Мы также будем использовать понимание списка, чтобы вызвать str на предметах.

subprocess.run(
    ["pfctl", "-t", const.PF_LISTNAME, "-T", "add"]
    + [str(item) for item in addedlist],
    check=True,
    stderr=subprocess.DEVNULL,
)
subprocess.run(
    ["pfctl", "-t", const.PF_LISTNAME, "-T", "delete"]
    + [str(item) for item in deletedlist],
    check=True,
    stderr=subprocess.DEVNULL,
)
...