Requests.get未完成,不会引发任何错误

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (392)

运行High Sierra时,我在osx上遇到了麻烦。

问题是在下面的代码中对requests.get的调用没有做任何事情。它根本不会使它脱离调用,也不会引发错误。get调用之后的print方法没有被执行,但应用程序没有崩溃,它只是继续到主循环,就像没有发生任何事情一样。

这个代码在linux上运行正常。我正在研究如何在Windows上尝试它,并希望另外安装osx。

我在这里完全失败了。事实上它甚至没有引起错误对我来说很奇怪。

import tkinter as tk
from tkinter import ttk
import multiprocessing
import time
import requests


class SplashScreen(tk.Toplevel):

    def __init__(self, root):
        super(SplashScreen, self).__init__(root)

        self.width = 800
        self.height = 400
        self.geometry('{Width}x{Height}'.format(Width=self.width, Height=self.height))
        self.overrideredirect(True)

        self.label = ttk.Label(self, text='My Splash', anchor='center')
        self.label.grid(column=0, row=2)

    def destroy_splash_screen(self):
        self.destroy()
        print('destroyed splash')


class App(tk.Tk):

    def __init__(self):
        super(App, self).__init__()

        self.splash = SplashScreen(self)

        self.withdraw()

        process_startup = multiprocessing.Process(
            target=self.startup_process,
            args=("stuff",)
        )
        process_startup.start()
        self.splash.update()

        while process_startup.is_alive():
            time.sleep(0.1)

        self.title("MyApp")

        self.mainloop()

    def mainloop(self, n=0):
        first_loop = True
        while True:
            self.update_idletasks()
            self.update()
            if first_loop:
                self.remove_splash_screen()
                first_loop = False

    def startup_process(self, things):
        init_client()

    def remove_splash_screen(self):
        self.splash.destroy_splash_screen()
        del self.splash
        self.deiconify()

def init_client():
    requests.get("http://httpbin.org/ip")
    s = 'strfff'
    print(s)


if __name__ == '__main__':
    app = App()

此外,如果我使用调试器,它会在请求库中的此处进入黑洞。

def should_bypass_proxies(url, no_proxy):
    """
    Returns whether we should bypass proxies or not.

    :rtype: bool
    """
    # Prioritize lowercase environment variables over uppercase
    # to keep a consistent behaviour with other http projects (curl, wget).
    get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper())

    # First check whether no_proxy is defined. If it is, check that the URL
    # we're getting isn't in the no_proxy list.
    no_proxy_arg = no_proxy
    if no_proxy is None:
        no_proxy = get_proxy('no_proxy')
    parsed = urlparse(url)

    if parsed.hostname is None:
        # URLs don't always have hostnames, e.g. file:/// urls.
        return True

    if no_proxy:
        # We need to check whether we match here. We need to see if we match
        # the end of the hostname, both with and without the port.
        no_proxy = (
            host for host in no_proxy.replace(' ', '').split(',') if host
        )

        if is_ipv4_address(parsed.hostname):
            for proxy_ip in no_proxy:
                if is_valid_cidr(proxy_ip):
                    if address_in_network(parsed.hostname, proxy_ip):
                        return True
                elif parsed.hostname == proxy_ip:
                    # If no_proxy ip was defined in plain IP notation instead of cidr notation &
                    # matches the IP of the index
                    return True
        else:
            host_with_port = parsed.hostname
            if parsed.port:
                host_with_port += ':{}'.format(parsed.port)

            for host in no_proxy:
                if parsed.hostname.endswith(host) or host_with_port.endswith(host):
                    # The URL does match something in no_proxy, so we don't want
                    # to apply the proxies on this URL.
                    return True

    with set_environ('no_proxy', no_proxy_arg):
        # parsed.hostname can be `None` in cases such as a file URI.
        try:
    # It executes this method and returns when stepped through but from here it just ends. doesn't go anywhere from this point
            bypass = proxy_bypass(parsed.hostname)
        except (TypeError, socket.gaierror):
            bypass = False

    if bypass:
        return True

    return False

此代码位于requests / utils.py中

提问于
用户回答回答于

似乎requests在MacOS。尝试通过设置trust_envFalse:禁用代理:

session = requests.Session()
session.trust_env = False  # No proxy settings from the OS
r = session.get(url)

热门问答

智聆口语评测返回结果里面的评分为0?

1,音频文件要符合16khz采样率16bit位深单声道,如果是mp3文件码率要高于48kbps,否则评分可能会出现偏低或者0 2,VoiceType是否和传入的音频文件一致,文本和音频是否一致. 3,看下sessionId是否在每次评测的时候都是一样的结果导致的   4,在初次...... 展开详请

MGOBE Team Room 和Room 的区别是什么?

推荐已采纳
您好,createRoom 的 teamNumber 为1,如果需要使用不同的teamId区分玩家,可以使用createTeamRoom。roomType这个参数是标志,例如在matchRoom接口就需要输入roomtype作为参数,之后从房间列表中找到 roomType和max...... 展开详请

信鸽推送支持各大厂商的离线推送,点击离线消息怎么做到先启动应用到首页再跳转到要打开的消息界面?

您好,有两种方式实现: 方式一:直接使用默认打开app,然后在receiver里面解析参数再跳转到指定的页面。 方式二:使用intent打开主页面,然后在主页面里面解析参数再跳转到指定的页面。 参考文档配置:https://cloud.tencent.com/document/p...... 展开详请

基于腾讯云区块链平台开发了区块链应用,上线前,还需要提供其它材料备案么?

Nancy WU

腾讯云 · 高级产品经理 (已认证)

腾讯云区块链产品经理,与区块链一同成长,欢迎交流
推荐

腾讯云区块链TBaaS服务已获国家互联网信息办公室第一批境内区块链信息服务备案,基于TBaaS开发上线后的区块链应用程序建议根据《区块链信息服务管理规定》等有关规定获取备案相关信息。

【有奖互动】新年将至,如何过一个技术范的新年?

气象学家气象学家记录气象文献阅读、编程和气象相关资讯。感谢关注!欢迎加入气象AI和Python交流群!
;************************************************* ; Happy_new_year_2021.ncl ;************************************************ ; ; Concepts ...... 展开详请

Linux系统加了弹性网卡却不能从外部访问?

推荐
回答来自于问答智囊团成员:Htroy 专栏:https://cloud.tencent.com/developer/column/89781 为了给云服务器增加一个外网IP,实现单主机多 IP 部署,或者在一个CVM上接入到多个私有网络中,我们可以通过绑定弹性网卡的方式实现。...... 展开详请

扫码关注云+社区

领取腾讯云代金券