【问题标题】:ipython doesn't execute codes like pythonipython 不执行像 python 这样的代码
【发布时间】:2015-02-01 18:01:25
【问题描述】:

我正在尝试执行此 API 调用:(名为 wwo.py

# -*- 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

【问题讨论】:

    标签: python console ipython tornado spyder


    【解决方案1】:

    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 与您的应用程序集成。如果这已经是一个 tornado 应用程序,那么最好的方法可能是通过 AsyncHTTPClient.fetch 返回的 Future 使用 tornado 的异步功能。否则,您最终可能会执行 IOLoop.run_sync(),这与使用阻塞 HTTPClient 相比没有显着优势,除非您正在编写一个希望能够在异步龙卷风上下文和同步上下文中使用的函数。

    【讨论】:

    • 啊,这就是为什么,我的想法是尝试将阻塞 urlopen 转换为异步客户端,因为我可以在没有 IOLoop 的情况下使用它
    • 现在,当我尝试在 spyder 中运行龙卷风程序并返回此RuntimeError: IOLoop is already running 时出现错误时,我似乎变得更好了@再次感谢您!
    • 如果你使用run_sync,你会想通过IOLoop()创建一个新的IOLoop,而不是通过IOLoop.instance()获取一个现有的实例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    相关资源
    最近更新 更多