2014-12-04 60 views
0

我试图做到这一点API调用代码:(名为​​)IPython中不执行像蟒蛇

# -*- coding: utf-8 -*- 
from tornado.httpclient import AsyncHTTPClient 

http_client = AsyncHTTPClient() 
url = '' 
response = '' 


def meteo(q='', key=''): 
    if len(key) != 29: 
     print 'Please provide a valid key' 
    elif q == '': 
     print 'please provide a valid city name or zip' 
    global url 
    url = 'http://api.worldweatheronline.com/free/v2/weather.ashx?q={0}&format=json&key= {1}'.format(q, key) 

    def handle_request(resp): 
     global response 
     if resp.error: 
      print "Error:", resp.error 
     else: 
      response = resp.body 

    http_client.fetch(url, handle_request) 

如果我尝试调用该文件,并从普通的Python控制台执行它,我不没有得到response,其中''
但是,如果我使用IPython控制台调用它,或者使用Spyder执行它,它会调用response,即使我没有初始化它,它也会被调用!

import wwo 

wwo.meteo(q='London', key='API_FREE_KEY') 

wwo.response # returns '' on normal python console, returns the full response on ipython console 

回答

2

AsyncHTTPClient.fetch异步方法。它立即返回,请求和响应的处理发生在IOLoop。当您以纯Python或简单的IPython终端运行代码时,不会运行IOLoop,因此请求实际上不会发生。

当您通过qtconsole(Spyder)或Notebook在IPython中运行它时,结果会有所不同,因为IPython本身已经运行了龙卷风IOLoop,因此异步事件最终会触发,并且您的回调被调用。

基于所提供的代码,它看起来像你想使用的阻挡HTTPClient,而不是AsyncHTTPClient,这将是这个样子:

from tornado.httpclient import HTTPClient 
http_client = HTTPClient() 
... 
resp = http_client.fetch(url) # returns HTTPResponse when it is complete 
response_body = resp.body 

根据应用程序的情况下,但是,你可能实际上想要使用AsyncHTTPClient,在这种情况下,您需要将IOLoop与您的应用程序集成。如果这已经是一个龙卷风应用程序,那么最好的方法是通过AsyncHTTPClient.fetch返回的Future来使用龙卷风的异步功能。否则,您最终可能会做IOLoop.run_sync(),除非您正在编写您希望能够在异步龙卷风上下文和同步上下文中使用的函数,否则它不会提供比使用阻塞HTTPClient更多的好处。

+0

啊,所以这就是为什么,这个想法是试图将阻塞'urlopen'转换为异步客户端,我可以在不使用IOLoop的情况下使用它[ – Abdelouahab 2014-12-04 21:34:27

+0

]我做到了这一点:D https://github.com/ abdelouahabb/tornadwwo – Abdelouahab 2014-12-04 22:58:34

+0

看来,现在我得到它更好,当我得到错误,当我尝试运行里面的Spyder龙卷风计划,并返回我这个'RuntimeError:IOLoop已经运行'再次谢谢你! – Abdelouahab 2014-12-04 23:24:50