在Python中使用Popen中的curl

时间:2016-07-07 20:35:01

标签: python curl popen

我在unix shell中运行这个curl命令,它可以工作(见下文)。我能够将返回的数据重定向到一个文件,但现在我想在我的代码中处理数据,而不是在文件中浪费一大堆空间。

curl -k -o outputfile.txt 'obfuscatedandVeryLongAddress'
#curl command above, python representation below
addr = "obfuscatedandVeryLongAddress"
theFile = subprocess.Popen(["curl", "-k", addr], stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True)
在此之后 theFile.stdout为空。 curl命令中返回的数据应该类似于4,000行(在shell中运行命令时验证)。大小是否打破了文件.stdout?我做错了什么吗?我尝试使用:

out, err = theFile.communicate()

然后打印out变量但仍然没有

编辑:格式化和澄清

3 个答案:

答案 0 :(得分:2)

您需要删除shell=True

theFile = subprocess.Popen(["curl", "-k", addr], stdout = subprocess.PIPE, stderr = subprocess.PIPE)

应该工作。

如果你shell=True,你应该传递一个字符串。否则,您实际执行的操作是将这些参数-kaddr作为参数传递给shell。因此,如果您的shell为sh,那么您所做的就是sh 'curl' -k addr

答案 1 :(得分:0)

Eugene是对你的问题的直接回答,但我想我会在使用requests库时添加一个,因为它需要更少的代码,并且对于需要查看代码的任何人来说都更容易阅读(并且具有跨平台的优势)。

import requests

response = requests.get('longaddress', verify=False)
print response.text

如果响应是json,则可以自动将其转换为python对象

print response.json()

答案 2 :(得分:0)

您可以将curl命令放在如下字符串中:

theFile = subprocess.Popen('curl -k {}'.format(addr), stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True)

或者你可以删除shell参数:

theFile = subprocess.Popen(["curl", "-k", addr], stdout = subprocess.PIPE, stderr = subprocess.PIPE)

或者您可以使用pycurl模块直接使用libcurl库并跳过整个附加过程。