如何在不返回整个输出的情况下使用从 subprocess.call 返回的数据?

How to use data returned from subprocess.call without returning the entire output?

def is_akamaized(url):
    stripped_http_url = url[8:]
    clean_host = stripped_http_url.rsplit('/')[0]
    nslookup_data = subprocess.call(["nslookup", clean_host], stdout=subprocess.PIPE)
    if nslookup_data.find('akamaiedge'):
        return "3[1;31mEnvironment is Acamaized {0}  -  {1}3[1;m"

此函数仅接受 url 并在其上运行 nslookup。我想要发生的是我想获取 nslookup 的输出并通过它解析某些关键字。问题是,使用当前代码,如果我传入一个应该工作的 url(在 nslookup 中包含单词 acamai)

print is_acamaized(url)

它returns 0

注意,我添加了 stdout=subprocess.PIPE 这样 nslookup 的整个输出就不会返回到终端。

关于如何将 nslookup 的输出分配给一个变量以便我可以访问它有什么建议吗?

subprocess.call() returns 退出代码,而不是标准输出。可以直接使用Popenclass:

nslookup_data = subprocess.Popen(["nslookup", clean_host], stdout=subprocess.PIPE).communicate()[0]

最后的.communicate()[0]很重要。这告诉 Popen 我们完成了,它 returns 一个元组:(stdout, stderr)。元组 [0] 中的第一项是标准输出。

您也可以使用 subprocess.check_output():

nslookup_data = subprocess.check_output(["nslookup", clean_host])