相关疑难解决方法(0)

在Python的调用者线程中捕获线程的异常

我对Python和多线程编程很新.基本上,我有一个脚本,将文件复制到另一个位置.我希望将它放在另一个线程中,以便我可以输出....以指示脚本仍在运行.

我遇到的问题是,如果文件无法复制,它将引发异常.如果在主线程中运行,这是可以的; 但是,具有以下代码不起作用:

try:
    threadClass = TheThread(param1, param2, etc.)
    threadClass.start()   ##### **Exception takes place here**
except:
    print "Caught an exception"
Run Code Online (Sandbox Code Playgroud)

在线程类本身,我试图重新抛出异常,但它不起作用.我看到这里的人问类似的问题,但他们似乎都在做一些比我想做的更具体的事情(而且我不太了解提供的解决方案).我见过人们提到使用它sys.exc_info(),但我不知道在哪里或如何使用它.

非常感谢所有帮助!

编辑:线程类的代码如下:

class TheThread(threading.Thread):
    def __init__(self, sourceFolder, destFolder):
        threading.Thread.__init__(self)
        self.sourceFolder = sourceFolder
        self.destFolder = destFolder

    def run(self):
        try:
           shul.copytree(self.sourceFolder, self.destFolder)
        except:
           raise
Run Code Online (Sandbox Code Playgroud)

python multithreading exception-handling exception

178
推荐指数
10
解决办法
15万
查看次数

Python中exit(0)和exit(1)之间的区别

Python exit(0)exit(1)Python 之间的区别是什么?

我试着环顾四周,但没有在这些方面找到具体的问题.如果它已经被回答,那么链接就足够了.

python exit-code

147
推荐指数
5
解决办法
23万
查看次数

为什么sys.exit()在Python中的线程内调用时不会退出?

这可能是一个愚蠢的问题,但我正在测试我对Python的一些假设,我很困惑为什么以下代码片段在线程中调用时不会退出,但在主线程中调用时会退出.

import sys, time
from threading import Thread

def testexit():
    time.sleep(5)
    sys.exit()
    print "post thread exit"

t = Thread(target = testexit)
t.start()
t.join()
print "pre main exit, post thread exit"
sys.exit()
print "post main exit"
Run Code Online (Sandbox Code Playgroud)

sys.exit()的文档声明调用应该从Python退出.我可以从这个程序的输出中看到"post thread exit"永远不会被打印出来,但是主线程在线程调用exit之后仍然继续运行.

是否为每个线程创建了一个单独的解释器实例,而对exit()的调用只是退出该单独的实例?如果是这样,线程实现如何管理对共享资源的访问?如果我确实想要从线程中退出程序(不是我真的想要,但我只是理解)该怎么办?

python python-2.6

80
推荐指数
5
解决办法
6万
查看次数

程序关闭期间在Python中捕获KeyboardInterrupt

我正在用Python编写命令行实用程序,因为它是生产代码,所以应该能够干净地关闭而不会将大量的东西(错误代码,堆栈跟踪等)转储到屏幕上.这意味着我需要捕获键盘中断.

我尝试过使用try catch块,如:

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print 'Interrupted'
        sys.exit(0)
Run Code Online (Sandbox Code Playgroud)

并捕捉信号本身(如在这篇文章中):

import signal
import sys

def sigint_handler(signal, frame):
    print 'Interrupted'
    sys.exit(0)
signal.signal(signal.SIGINT, sigint_handler)
Run Code Online (Sandbox Code Playgroud)

这两种方法在正常操作期间似乎都能很好地工作.但是,如果在应用程序结束时清理代码期间出现中断,Python似乎总是在屏幕上打印一些东西.捕获中断给出了

^CInterrupted
Exception KeyboardInterrupt in <bound method MyClass.__del__ of <path.to.MyClass object at 0x802852b90>> ignored
Run Code Online (Sandbox Code Playgroud)

而处理信号也给出了

^CInterrupted
Exception SystemExit: 0 in <Finalize object, dead> ignored
Run Code Online (Sandbox Code Playgroud)

要么

^CInterrupted
Exception SystemExit: 0 in <bound method MyClass.__del__ of <path.to.MyClass object at 0x802854a90>> ignored
Run Code Online (Sandbox Code Playgroud)

这些错误不仅难看,而且对于没有源代码的最终用户来说也不是很有帮助!

此应用程序的清理代码相当大,因此真正的用户可能会遇到此问题.有没有办法捕获或阻止此输出,或者它只是我必须处理的东西?

python keyboardinterrupt

57
推荐指数
2
解决办法
11万
查看次数

停止Python代码没有错误

比方说,我有一段不在函数中的代码

x = 5
y = 10
if x > 5:
    print("stopping")
Run Code Online (Sandbox Code Playgroud)

在print语句之后我可以放置什么来阻止代码进一步运行?Sys.exit()有效,但会引发一个我不希望在程序中出现的错误.我希望它能够悄悄地停止代码,就像它已经到达主循环的末尾一样.谢谢.

python python-3.3

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