我已经编写了一些代码,用于使用python库threading.Timer
定期运行某些函数。它使用了一些外部类:
class MyClass:
def __init__(self, session):
self.session = session # session is an external class instance
def doPeriodically(self):
self.session.open_spectrum(spectrum_file) # open spectrum file using session
t = threading.Timer(5, self.doPeriodically, [], {}) # set up a timer
def startPeriodicJob(self):
self.doPeriodically()
mc = MyClass(session)
mc.startPeriodicJob()
我使用Ubuntu 13.10和python 2.7.5+以及Tkinter版本:81008在笔记本电脑上运行我的扩展,一切运行良好。但是当我使用Ubuntu 12.04 LTS和python 2.7.3以及Tkinter Revision:81008将相同的代码复制到我的桌面时,代码总是会出现错误(见下文)。
但是注意:我的代码是sparky的扩展,它在其中提供了python 2.4.2。因此代码应该由python 2.4.2解释。它也可以在以下错误消息中看到。
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/local/src/sparky/platforms/linux-2.6.9/python-2.4.2/lib/python2.4/threading.py", line 442, in __bootstrap
self.run()
File "/usr/local/src/sparky/platforms/linux-2.6.9/python-2.4.2/lib/python2.4/threading.py", line 605, in run
self.function(*self.args, **self.kwargs)
File "/path/to/my/own/code/MyClass.py", line 64, in doPeriodically
self.session.do_jobs()
Error: session 0 not found
我的计算机上没有python 2.4.2的路径。它来自我编写扩展名的预编译二进制程序。
难题是,代码在一台计算机上运行良好,但在另一台计算机上运行良好。而且似乎是程序中发布的python 2.4.2解释了我的扩展名(MyClass.py),因此两台计算机上的python版本不应该在这里发挥作用。
可能是什么问题?不同的线程可以使用相同的Session实例来执行其成员函数吗?
如果我将Session实例传递给函数
,则无效class MyClass:
def __init__(self, session):
self.session = session # session is an external class instance
def doPeriodically(self, sess):
sess.open_spectrum(spectrum_file) # open spectrum file using session
t = threading.Timer(5, self.doPeriodically, [sess,]) # set up a timer
def startPeriodicJob(self):
self.doPeriodically(self.session)
mc = MyClass(session)
mc.startPeriodicJob()
PS。 Session类可以在sparky包中找到: https://www.cgl.ucsf.edu/home/sparky/