我正在编写一个使用文件路径导入模块的程序,函数为 imp.load_source(module_name,module_path)。当我尝试将对象从该模块传递到 Process 时,这似乎会导致问题。
一个例子:
import multiprocessing
import imp
class MyProcess(multiprocessing.Process):
def __init__(self,thing):
multiprocessing.Process.__init__(self)
self.thing=thing
def run(self):
x=self.thing
if __name__=="__main__":
module=imp.load_source('life', 'C:\\Documents and Settings\\User\\workspace\\GarlicSim\\src\\simulations\\life\\life.py')
thing=module.step
print(thing)
p=MyProcess(thing)
p.start()
注意:要使此代码“有效”,您必须将我提供给 imp.load_source 的参数替换为其他内容:它必须是您计算机上的某个 Python 文件,最好不在同一个文件夹。然后,在 thing=module.step 中,代替 step 放入在该 .py 文件中定义的一些随机函数或类。
我得到以下回溯:
<function step at 0x00D5B030>
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python26\lib\multiprocessing\forking.py", line 342, in main
self = load(from_parent)
File "C:\Python26\lib\pickle.py", line 1370, in load
return Unpickler(file).load()
File "C:\Python26\lib\pickle.py", line 858, in load
dispatch[key](self)
File "C:\Python26\lib\pickle.py", line 1090, in load_global
klass = self.find_class(module, name)
File "C:\Python26\lib\pickle.py", line 1124, in find_class
__import__(module)
ImportError: No module named life
那我该怎么办?
编辑:
我在 Win XP 上使用 Python 2.6.2c1。
请您参考如下方法:
可能因为将导入代码放入主 block 而无法正常工作。 下面的代码适用于 Windows XP、Python 2.6。那么life模块也会在新进程中导入。
import multiprocessing
import imp
class MyProcess(multiprocessing.Process):
def __init__(self,thing):
multiprocessing.Process.__init__(self)
self.thing=thing
def run(self):
print("Exiting self.thing")
self.thing()
print("Finished")
life=imp.load_source('life', r'd:\temp5\life.py')
if __name__=="__main__":
p=MyProcess(life.step)
p.start()
