相关疑难解决方法(0)

在现代Python中声明自定义异常的正确方法?

在现代Python中声明自定义异常类的正确方法是什么?我的主要目标是遵循标准的其他异常类,因此(例如)我在异常中包含的任何额外字符串都会被捕获异常的任何工具打印出来.

通过"现代Python",我指的是将在Python 2.5中运行的东西,但对于Python 2.6和Python 3*的处理方式来说是"正确的".而"自定义"我指的是一个Exception对象,它可以包含有关错误原因的额外数据:一个字符串,也许还有一些与异常相关的任意对象.

我被Python 2.6.2中的以下弃用警告绊倒了:

>>> class MyError(Exception):
...     def __init__(self, message):
...         self.message = message
... 
>>> MyError("foo")
_sandbox.py:3: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
Run Code Online (Sandbox Code Playgroud)

看起来很疯狂,BaseException对于名为的属性具有特殊含义message.我从PEP-352收集到该属性确实在2.5中有特殊含义他们试图弃用,所以我猜这个名字(而且仅此一个)现在被禁止了?啊.

我也模糊地意识到它Exception有一些神奇的参数args,但我从来不知道如何使用它.我也不确定这是向前发展的正确方法; 我在网上发现的很多讨论都表明他们试图在Python 3中废除args.

更新:两个答案建议覆盖__init__,和__str__/ __unicode__/ __repr__.这似乎很多打字,是否有必要?

python exception custom-exceptions

1176
推荐指数
11
解决办法
60万
查看次数

函数调用超时

我正在调用Python中的一个函数,我知道它可能会停止并迫使我重新启动脚本.

如何调用该函数或我将其包装成什么,以便如果它花费的时间超过5秒,脚本会取消它并执行其他操作?

python multithreading timeout python-multithreading

259
推荐指数
14
解决办法
27万
查看次数

python requests.get超时的完成响应

我正在收集网站列表的统计数据,为了简单起见,我正在使用它的请求.这是我的代码:

data=[]
websites=['http://google.com', 'http://bbc.co.uk']
for w in websites:
    r= requests.get(w, verify=False)
    data.append( (r.url, len(r.content), r.elapsed.total_seconds(), str([(l.status_code, l.url) for l in r.history]), str(r.headers.items()), str(r.cookies.items())) )
Run Code Online (Sandbox Code Playgroud)

现在,我希望requests.get在10秒后超时,这样循环就不会卡住.

这个问题之前也引起了人们的兴趣,但没有一个答案是清晰的.我将在此给予一些赏金以获得一个很好的答案.

我听说也许不使用请求是一个好主意,但那么我应该如何获得请求提供的好东西.(元组中的那些)

python timeout python-requests

134
推荐指数
11
解决办法
18万
查看次数

在Python中使用超时运行一些代码的正确方法

我在网上找了一些SO讨论和ActiveState配方来运行一些超时的代码.看起来有一些常见的方法:

  • 使用运行代码的线程,并join使用超时.如果超时已超时 - 终止该线程.这在Python(使用的私有_Thread__stop函数)中不是直接支持的,所以这是不好的做法
  • 使用signal.SIGALRM- 但这种方法不适用于Windows!
  • 使用带有超时的子进程- 但这太重了 - 如果我想经常启动可中断任务,我不希望每个进程都有火!

那么,正确的方法是什么?我不是在询问有关变通方法(例如使用Twisted和async IO),而是解决实际问题的实际方法 - 我有一些功能,我想只运行一些超时.如果超时,我想要控制回来.我希望它能在Linux和Windows上运行.

python windows multithreading timeout

30
推荐指数
3
解决办法
2万
查看次数

如何在python中超时函数,超时不到一秒

问题规格:

我正在搜索日志文件的大量行,并且我将这些行分发到组以便使用该re.match()函数存储的正则表达式(RegExses).不幸的是,我的一些RegExses太复杂了,Python有时会让自己回归地狱.因此,我需要通过某种超时来保护它.

问题:

  • re.match我正在使用,是Python的功能,正如我在StackOverflow上找到的那样(我真的很抱歉,我现在找不到链接:-().用运行Python的库来中断线程非常困难.这个原因线程已经脱离游戏.
  • 因为re.match函数的评估花费的时间相对较短,而且我想用这个函数分析大量的行,我需要一些不需要太长时间才能执行的超时函数(这使得线程更不合适,需要很长时间才能初始化新线程)并且可以设置为小于一秒.
    由于这些原因,这里的答案 - 函数调用超时 和此处 - 超时功能,如果花费太长时间完成装饰器(警报 - 1秒和更长时间)不在桌面上.

我今天早上都在寻找这个问题的解决方案,但我没有找到任何满意的答案.

python regex timeout function

20
推荐指数
1
解决办法
7033
查看次数

如何为python unittest指定测试超时?

我正在使用python框架unittest.是否可以通过框架的能力指定测试超时?如果不是,是否可以timeout为所有测试和某些单独的测试优雅地指定每个测试的私有值?
我想global timeout为所有测试定义一个(默认情况下它们将使用它)和一些可能需要很长时间的测试的超时.

python unit-testing timeout

19
推荐指数
2
解决办法
9383
查看次数

Web应用程序在ssl.py中挂起几个小时在self._sslobj.do_handshake()

我使用的是Python 2.7.5.我有一个网络应用程序,每隔几分钟就会查询一次API,并且在最后一天左右成功运行.然而,在让它坐了几个小时后,我回来发现我的程序停滞了几个小时没有活动.我退出程序,发现它在一天的API调用期间大部分时间都在ssl握手方法中停滞不前.

这是追溯:

...
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 143, in __init__
  self.do_handshake()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 305, in do_handshake
  self._sslobj.do_handshake()
Run Code Online (Sandbox Code Playgroud)

我做了一些研究,似乎这是Python 2.6中的SSL库的一个问题,但它已被修复.我想知道为什么我的程序卡在这里而不抛出异常或任何东西.

如果有一种方法可以为SSL握手方法设置超时,我很乐意这样做,因为我希望避免我的程序无限期地从这样的事情中停止.我正在使用Requests HTTP库,这在Mac OSX 10.9上运行,如果这很重要的话.建议?

编辑: 我做了一些研究,似乎其他人已经有SSL的这个特定问题,尽管在2.6中实现了"修复".但是,不确定解决方案是什么.任何帮助表示赞赏.

编辑3: 添加我的解决方案作为这个问题的答案.

python ssl pyopenssl

18
推荐指数
2
解决办法
4678
查看次数

Python请求,如何限制接收大小,传输速率和/或总时间?

我的服务器执行外部请求,我想限制失败请求可以造成的损害.我想在这些情况下取消请求:

  • 请求的总时间超过一定限度(即使数据仍然到达)
  • 总收到的大小超过了一些限制(我需要在接受更多数据之前取消)
  • 传输速度下降到某个水平以下(如果可以提供总时间限制,我可以没有这个)

注意我不是timeout在请求中查找参数,因为这只是不活动的超时.我无法找到与总超时或限制总大小的方法有关的任何事情.一个示例显示了maxsize参数,HTTPAdapter但未记录.

我怎样才能使用这些要求requests

python python-requests

10
推荐指数
1
解决办法
8459
查看次数

如何在Python中实现看门狗定时器?

我想在Python中实现一个简单的看门狗定时器,有两个用例:

  • Watchdog确保函数的执行时间不超过x
  • 看门狗确保某些经常执行的功能确实执行至少每y

我怎么做?

python watchdog

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

@timeout(timelimit)装饰器如何工作?

我发现这个装饰器在Stack Overflow上超时了一个函数,我想知道是否有人可以详细解释它是如何工作的,因为代码非常优雅但根本不清楚.用法是@timeout(timelimit).

from functools import wraps
import errno
import os
import signal

class TimeoutError(Exception):
    pass

def timeout(seconds=100, error_message=os.strerror(errno.ETIME)):
    def decorator(func):
        def _handle_timeout(signum, frame):
            raise TimeoutError(error_message)

        def wrapper(*args, **kwargs):
            signal.signal(signal.SIGALRM, _handle_timeout)
            signal.alarm(seconds)
            try:
                result = func(*args, **kwargs)
            finally:
                signal.alarm(0)
            return result

        return wraps(func)(wrapper)

    return decorator
Run Code Online (Sandbox Code Playgroud)

python

9
推荐指数
1
解决办法
821
查看次数