我编写了一个使用单元测试框架的GUI应用程序。应用程序在树状视图中显示所有找到的单元测试。如果单击单元测试名称,程序将运行该测试并显示结果。它的工作原理!
但是现在我想让每个测试用例在一个新的进程中运行。我创建了一个"工作线程"(与模块线程),但这个线程也在同一进程中运行。
模块"多处理"是解决方案,但我得到了我的实现问题。我把我的"测试执行代码"放在一个自己的函数中,并尝试:
item = self.GetSelection()
name = self.GetItemText(item)
p = multiprocessing.Process(target=ExecuteTest, args=(name, item))
p.daemon = True
p.start()
但是我得到了错误。
Traceback (most recent call last):
File "C:abchhha.py", line 577, in OnLeftDClick
p.start()
File "C:Python26libmultiprocessingprocess.py", line 104, in start
self._popen = Popen(self)
File "C:Python26libmultiprocessingforking.py", line 239, in __init__
dump(process_obj, to_child, HIGHEST_PROTOCOL)
File "C:Python26libmultiprocessingforking.py", line 162, in dump
ForkingPickler(file, protocol).dump(obj)
File "C:Python26libpickle.py", line 224, in dump
self.save(obj)
File "C:Python26libpickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:Python26libpickle.py", line 419, in save_reduce
save(state)
File "C:Python26libpickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:Python26libpickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:Python26libpickle.py", line 681, in _batch_setitems
save(v)
File "C:Python26libpickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:Python26libpickle.py", line 548, in save_tuple
save(element)
File "C:Python26libpickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:Python26libpickle.py", line 419, in save_reduce
save(state)
File "C:Python26libpickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:Python26libpickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:Python26libpickle.py", line 686, in _batch_setitems
save(v)
File "C:Python26libpickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:Python26libpickle.py", line 396, in save_reduce
save(cls)
File "C:Python26libpickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:Python26libpickle.py", line 748, in save_global
(obj, module, name))
pickle.PicklingError: Can't pickle <type 'PySwigObject'>: it's not found as __builtin__.PySwigObject
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:Python26libmultiprocessingforking.py", line 342, in main
self = load(from_parent)
File "C:Python26libpickle.py", line 1370, in load
return Unpickler(file).load()
File "C:Python26libpickle.py", line 858, in load
dispatch[key](self)
File "C:Python26libpickle.py", line 880, in load_eof
raise EOFError
EOFError
有人知道吗?
显然,您正在尝试"pickle"不可拾取的东西(似乎是一个wx对象)。尝试只使用"简单"对象作为参数(即内部没有图形对象),它应该工作得更好。您还可以看看python nose unitest库,它允许您在多进程中自动运行测试。
我建议您创建一个单独的脚本来运行测试,然后您可以使用subprocess
模块调用该脚本,为其提供要运行的测试的名称。
好处是,您可以在持续集成服务器、夜间构建或其他不需要GUI的批处理类型进程中使用相同的脚本。
使用fork生成一个子进程。这将需要您做一些工作,但将工作。
注意:multiprocessing模块是使用fork实现的。
Update:仔细查看您的代码后,似乎item
变量是不可pickle的(这是一个词吗?)。我认为您不需要它,因为您可以用更简单的东西(值或其他类型)替换它。