我对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 exit(0)
和exit(1)
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编写命令行实用程序,因为它是生产代码,所以应该能够干净地关闭而不会将大量的东西(错误代码,堆栈跟踪等)转储到屏幕上.这意味着我需要捕获键盘中断.
我尝试过使用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)
这些错误不仅难看,而且对于没有源代码的最终用户来说也不是很有帮助!
此应用程序的清理代码相当大,因此真正的用户可能会遇到此问题.有没有办法捕获或阻止此输出,或者它只是我必须处理的东西?
比方说,我有一段不在函数中的代码
x = 5
y = 10
if x > 5:
print("stopping")
Run Code Online (Sandbox Code Playgroud)
在print语句之后我可以放置什么来阻止代码进一步运行?Sys.exit()有效,但会引发一个我不希望在程序中出现的错误.我希望它能够悄悄地停止代码,就像它已经到达主循环的末尾一样.谢谢.