import os
os.system("curl --head http://somewebsite.com")
打印出来:
HTTP/1.1 200 OK
Server: MochiWeb/1.0
Date: Fri, 22 Aug 2014 22:24:54 GMT
Content-Type: application/json
Cache-Control: no-cache
Access-Control-Allow-Origin: *
因此,此链接以JSON格式返回流数据,如何在Python中记录响应?
答案 0 :(得分:2)
你不应该这样做。我稍后会解释原因;首先,我将展示如何使其工作。你有三个问题,你必须解决所有问题。
正如curl
联机帮助页所说:
-I, --head
(HTTP / FTP / FILE)仅获取HTTP标头! HTTP服务器具有HEAD命令,它只用于获取文档的标题。在FTP或FILE文件上使用时,curl仅显示文件大小和上次修改时间。
因此,您明确告诉curl要求服务器不要向您发送响应正文。要解决此问题,请不要发送--head
。
os.system("curl http://somewebsite.com")
正如os.system
文档所说:
在Unix上,返回值是以
wait()
指定的格式编码的进程的退出状态...在Windows上,返回值是运行命令后系统shell返回的值。
换句话说,你得到的只是退出代码 - 一个小整数。输出刚打印出来;没有办法记录它。要实际记录文本,请查看下一段:
subprocess
模块提供了更强大的工具来生成新流程并检索其结果;使用该模块比使用此功能更可取。有关一些有用的配方,请参阅subprocess
文档中的Replacing Older Functions with thesubprocess
Module部分。
按照该链接,它会在第一个示例中显示如何获取输出:使用check_output
功能。请注意,您必须将该命令行转换为参数列表。 (你可以使用shell=True
代替,但是没有充分的理由;所有的shell都会在这里为你做的就是挡路了。)
output = subprocess.check_output(["curl", "http://somewebsite.com"])
最后,默认情况下,curl
将正文输出到标准输出 - 这很好,这就是你正在捕捉的东西 - 但它也会输出东西到stderr,其中可能包括进度表,标题等。 ,取决于各种情况。除非您想要捕获这些信息,或者只是将其转储供用户查看,否则您想告诉curl不要这样做。有关详细信息,请参阅上面链接的联机帮助页:
output = subprocess.check_output(["curl", "-q", "http://somewebsite.com"])
所以,这很有效。你为什么不想这样做?
因为有更好的方法可以做你想要的:urllib.request
模块(或者,如果你使用的是Python 2.x,urllib2
):
output = urllib.request.urlopen('http://www.somewebsite.com').read()
这怎么样更好?
curl
的系统。curl
给您的任何内容。Popen
它来自Python并从两个管道中读取而没有死锁。