如何在Python中将字符串列表传递给外部命令?

时间:2018-10-31 05:24:30

标签: python openbsd

我正在编写一个Python程序,该程序将下载错误的IP地址列表,并从OpenBSD pf中的表中添加/删除这些IP地址。该程序下载列表,将其格式化(作为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)

其中:

addedlistdeletedlist分别是要添加和删除的IP地址对象的格式化列表。

我只希望对每个列表运行一次pfctl命令,并将addedlistdeletedlist传递给命令,因为从列表开始(咳嗽 IPv6 *咳嗽*)可能会很长。但是,当我尝试执行此操作时,Python抱怨没有期望列表。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您必须将item连接到参数列表,而不是将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,
)