我正在尝试获取python-gasp在 Windows 上工作,但是当我这样做时 import gasp; gasp.begin_graphics()
我得到以下回溯:
File "C:\Python26\lib\site-packages\gasp\backend.py", line 142, in create_screen
screen.updater.start()
File "C:\Python26\lib\multiprocessing\process.py", line 104, in start
self._popen = Popen(self)
File "C:\Python26\lib\multiprocessing\forking.py", line 239, in __init__
dump(process_obj, to_child, HIGHEST_PROTOCOL)
File "C:\Python26\lib\multiprocessing\forking.py", line 162, in dump
ForkingPickler(file, protocol).dump(obj)
File "C:\Python26\lib\pickle.py", line 224, in dump
self.save(obj)
File "C:\Python26\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Python26\lib\pickle.py", line 419, in save_reduce
save(state)
File "C:\Python26\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python26\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "C:\Python26\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python26\lib\pickle.py", line 725, in save_inst
save(stuff)
File "C:\Python26\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python26\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "C:\Python26\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Python26\lib\pickle.py", line 396, in save_reduce
save(cls)
File "C:\Python26\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python26\lib\pickle.py", line 748, in save_global
(obj, module, name))
PicklingError: Can't pickle <class 'multiprocessing.process._MainProcess'>: it's not found as multiprocessing.process._MainProcess
知道为什么我在 Windows XP 上收到此错误,但在 Ubuntu Linux 9.04 上却没有收到此错误吗?
看起来像screen.updater
是 Updater(multiprocessing.Process)
的一个实例( def ),如果有帮助的话。有问题的文件位于 http://bazaar.launchpad.net/~gasp-dev/gasp-core/main/annotate/head%3A/gasp/backend.py
最佳答案
您的 Updater
类有一个成员 screen
,它本身有一个成员 process
,它接收 multiprocessing.current_process( )
。
当您调用updater.start()
时,它会尝试pickle更新程序。这种情况只发生在 Windows 上,因为 Linux 使用 fork()
而不是 pickling。但是,当前进程对象无法被 pickle 并引发异常。
要解决此问题,您可以删除 process
成员。
关于python - multiprocessing.Process 子类适用于 Linux,但不适用于 Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2064533/