如何将子进程的结果放在变量中

时间:2015-10-12 11:32:07

标签: python subprocess

我只能通过使用cURL来检索我的数据,我认为子进程是更简单的方法,但是我不能将数据放在变量中。

例如像这样

data = subprocess.call('curl "URL" -X GET', shell=True)

通过python有没有简单的方法呢?

3 个答案:

答案 0 :(得分:4)

如果您尝试使用子流程执行此操作并希望调用结果,那么您正在寻找check_output

data = subprocess.check_output(["curl", URL])

但是,我建议您使用Python中的requests库来完成您的工作。丰富的功能将使您的生活更轻松。

以下是使用请求的简单示例:

确保先安装了请求。它不是内置库。我链接的URL将解释如何执行此操作。

>>> import requests
>>> d = requests.get("http://www.google.ca")
>>> print(d)
<Response [200]>

您可以从该响应中获得大量数据。如果您执行d.text,您将收到文本回复。我建议你阅读文档以了解如何使用它。这是一个功能齐全的图书馆,拥有众多功能。

我建议您查看所需的所有其他内容的文档。

答案 1 :(得分:1)

试试这个:

data = subprocess.Popen(command, shell=True, stdout = subprocess.PIPE, stderr=subprocess.PIPE)
std_out, std_err = data.communicate()

Docs

该页面还包含有关shell=True危险的原因的说明。值得一读

修改

这是做你想做的事的艰难方法。它有效,所以我发布了一个替代方案,但我建议@idjaw答案

答案 2 :(得分:0)

以下方法对我有用。如果您需要使用多个参数运行命令,它可以使用:

def run_shell_command(cmd, params):
        cmd_list = []
        cmd_list.append(cmd)
        cmd_list + string.split(params)
        p = subprocess.Popen(cmd_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        std_out, std_err = p.communicate()
        return std_out, std_err

然后,按如下方式调用该函数:

outp = run_shell_command('curl', '\"URL\" -X GET')

P.S:你don't需要使用shell=True