相关疑难解决方法(0)

如何制作一系列功能装饰器?

如何在Python中创建两个装饰器来执行以下操作?

@makebold
@makeitalic
def say():
   return "Hello"
Run Code Online (Sandbox Code Playgroud)

...应该返回:

"<b><i>Hello</i></b>"
Run Code Online (Sandbox Code Playgroud)

我不是试图HTML在一个真实的应用程序中这样做 - 只是试图了解装饰器和装饰器链是如何工作的.

python decorator python-decorators

2647
推荐指数
17
解决办法
49万
查看次数

超时功能,如果完成时间太长

我有一个shell脚本循环遍历包含URL的文本文件:我想访问并截取屏幕截图.

这一切都做得很简单.该脚本初始化一个类,该类在运行时创建列表中每个站点的屏幕截图.有些站点需要非常长的时间来加载,有些站点可能根本没有加载.所以我想将screengrabber-function包装在一个超时脚本中,False如果它在10秒内无法完成,则使函数返回.

我满足于最简单的解决方案,也许设置一个异步计时器,无论在函数内部实际发生什么,它将在10秒后返回False?

python

135
推荐指数
2
解决办法
16万
查看次数

使用urllib2或任何其他http库读取超时

我有读取这样的网址的代码:

from urllib2 import Request, urlopen
req = Request(url)
for key, val in headers.items():
    req.add_header(key, val)
res = urlopen(req, timeout = timeout)
# This line blocks
content = res.read()
Run Code Online (Sandbox Code Playgroud)

超时适用于urlopen()调用.但是然后代码进入res.read()调用,我想要读取响应数据,并且不会在那里应用超时.因此,读取调用可能几乎永远挂起,等待来自服务器的数据.我发现的唯一解决方案是使用一个信号来中断read(),因为我正在使用线程,所以不适合我.

还有哪些其他选择?是否有用于处理读取超时的Python的HTTP库?我看过httplib2和请求,他们似乎遇到了与上面相同的问题.我不想使用套接字模块编写自己的非阻塞网络代码,因为我认为应该已经有了一个库.

更新:以下解决方案都没有为我做.您可以自己查看设置套接字或urlopen超时在下载大文件时无效:

from urllib2 import urlopen
url = 'http://iso.linuxquestions.org/download/388/7163/http/se.releases.ubuntu.com/ubuntu-12.04.3-desktop-i386.iso'
c = urlopen(url)
c.read()
Run Code Online (Sandbox Code Playgroud)

至少在使用Python 2.7.3的Windows上,超时被完全忽略.

python sockets timeout http nonblocking

25
推荐指数
4
解决办法
1万
查看次数

如何使用python请求执行限时响应下载?

当用python下载大文件时,我想为时间限制设置一个时间限制,不仅适用于连接过程,还适用于下载.

我正在尝试使用以下python代码:

import requests

r = requests.get('http://ipv4.download.thinkbroadband.com/1GB.zip', timeout = 0.5, prefetch = False)

print r.headers['content-length']

print len(r.raw.read())
Run Code Online (Sandbox Code Playgroud)

这不起作用(下载没有时间限制),正如文档中正确指出的那样:https://requests.readthedocs.org/en/latest/user/quickstart/#timeouts

如果有可能,这将是伟大的:

r.raw.read(timeout = 10)
Run Code Online (Sandbox Code Playgroud)

问题是,如何为下载设置时间限制?

python urllib3 python-requests

11
推荐指数
1
解决办法
6656
查看次数

Python套接字库认为套接字是打开的

我正在使用一些看起来像这样的Python:

HOST = '127.0.0.1'
PORT = 43434
single = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    single.bind((HOST, PORT))
except socket.error as e:
    # Print an error, exit.
Run Code Online (Sandbox Code Playgroud)

虽然它在过去运作良好,但我们现在得到了错误[Errno 98] Address already in use.SIGINT处理程序关闭套接字连接,所以我不确定它是如何进入该状态的,但是现在我只是想修复它.

两者lsofnetstat说没有使用该端口:

[$]> sudo netstat -an | grep 43434
[$]> sudo lsof -i :43434
Run Code Online (Sandbox Code Playgroud)

TIME_WAIT根据/proc/sys/net/ipv4/tcp_fin_timeout,设置为60秒,但错误发生在上次成功运行后数小时.

我试过(暂时)设置REUSEADDR(通过single.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)),但似乎没有效果.

什么在tarnation正在发生?我是否能够再次使用此端口而无需重启机器?

python sockets linux networking

7
推荐指数
1
解决办法
1336
查看次数

Python/Django 1.5 DatabaseWrapper线程错误

当我运行服务器并尝试加载本地版本的Web应用程序时,在Django 1.5.1(和1.5.0)和mysql中抛出以下DatabaseError:

/的DatabaseError /

在线程中创建的DatabaseWrapper对象只能在同一个线程中使用.具有别名'default'的对象是在线程ID 4365488128中创建的,这是线程ID 140735183980896.

例外位置如下:

/Users/USERNAME/.envs/PROJECT_NAME/lib/python2.7/site-packages/django/db/backends/ init .py in validate_thread_sharing,第154行

这仅在第一页加载时发生.当我点击刷新时,Web应用程序按预期加载.当我改变Django/python代码并且本地服务器需要重新验证时,错误返回.当发生这种情况时,第一次加载再次抛出DatabaseError,后续加载再次抛出.

这个问题只发生在我的Django 1.5项目上.我已经卸载了mysql并清除了位于/ usr/local/var/mysql中的mysql二进制文件.全新安装的mysql还没有解决这个问题.

这里讨论类似的DatabaseError,但我无法遵循他们的解决方案:

https://code.djangoproject.com/ticket/17998

我在这里不知所措,任何想法或专业知识都将受到赞赏.谢谢.

python mysql django python-2.7 django-1.5

6
推荐指数
2
解决办法
3376
查看次数

避免挂在 conn.getresponse() ( httplib.HTTPConnection ) 上

我用 python 编写了一个爬虫,根据一些给定的网址从网站下载一些网页。我注意到我的程序有时会挂在“conn.getresponse()”这一行。没有抛出任何异常,程序只是永远在那里等待。

conn = httplib.HTTPConnection(component.netloc)
conn.request("GET", component.path + "?" + component.query)
resp = conn.getresponse() #hang here
Run Code Online (Sandbox Code Playgroud)

我读了 api 文档,它说(添加超时):

conn = httplib.HTTPConnection(component.netloc, timeout=10)
Run Code Online (Sandbox Code Playgroud)

但是,它不允许我“重试”连接。超时后重试爬网的最佳做法是什么?

例如,我正在考虑以下解决方案:

trials = 3
while trials > 0:
    try:
        ... code here ...
    except:
        trials -= 1
Run Code Online (Sandbox Code Playgroud)

我的方向正确吗?

python timeout http

5
推荐指数
1
解决办法
3345
查看次数

Python请求超时

我已经通过阅读http://www.mobify.com/blog/http-requests-are-hard/http://docs.python-requests.org/en/latest/api/#requests.request到更好地了解超时.基于此我可以看到有连接超时:

connect_timeout = 0.0001

try:
    response = requests.get(url="https://httpbin.org/delay/5",
                        timeout=(connect_timeout, 10.0))
except requests.exceptions.ConnectTimeout as e:
    print "Too slow Mojo!"
Run Code Online (Sandbox Code Playgroud)

并读取超时:

read_timeout = 1.0

try:
    response = requests.get(url="https://httpbin.org/delay/5",
                        timeout=(10.0, read_timeout))
except requests.exceptions.ReadTimeout as e:
    print "Waited too long between bytes."
Run Code Online (Sandbox Code Playgroud)

如果响应未在特定时间内完成,我也有兴趣让请求模块"放弃".我不确定这种超时的用语是什么.我怎么会这样呢?

python python-requests

5
推荐指数
0
解决办法
4590
查看次数

Python urllib2不遵守超时

以下两行代码将永远挂起:

import urllib2
urllib2.urlopen('https://www.5giay.vn/', timeout=5)
Run Code Online (Sandbox Code Playgroud)

这是python2.7,并且没有设置http_proxy或任何其他env变量。任何其他网站都可以正常工作。我也可以毫无问题地获取该网站。可能是什么问题?

urllib2 python-2.7

4
推荐指数
1
解决办法
1652
查看次数