通过文件路径导入模块时使用Python多处理
我正在编写一个程序,它使用文件路径导入模块,函数为通过文件路径导入模块时使用Python多处理,python,import,module,multiprocessing,Python,Import,Module,Multiprocessing,我正在编写一个程序,它使用文件路径导入模块,函数为imp.load\u source(module\u name,module\u path)。当我试图将对象从该模块传递到进程时,它似乎会导致问题 例如: import multiprocessing import imp class MyProcess(multiprocessing.Process): def __init__(self,thing): multiprocessing.Process.__init__
imp.load\u source(module\u name,module\u path)
。当我试图将对象从该模块传递到进程时,它似乎会导致问题
例如:
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\u 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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Python26\lib\multiprocessing\forking.py”,第342行,在main中
self=加载(从父级)
加载文件“C:\Python26\lib\pickle.py”,第1370行
返回Unpickler(file.load())
加载文件“C:\Python26\lib\pickle.py”,第858行
调度[键](自身)
文件“C:\Python26\lib\pickle.py”,第1090行,在load\u global中
klass=self.find_类(模块,名称)
文件“C:\Python26\lib\pickle.py”,第1124行,在find\u类中
__导入(模块)
ImportError:没有名为life的模块
那我该怎么办
编辑:
我在Win XP上使用Python 2.6.2c1。test.py
在任何文件夹上:
import multiprocessing
import imp
class MyProcess(multiprocessing.Process):
def __init__(self,thing):
multiprocessing.Process.__init__(self)
self.thing=thing
def run(self):
print 'running...', self.thing()
if __name__=="__main__":
module=imp.load_source('life', '/tmp/life.py')
thing=module.step
print(thing)
p=MyProcess(thing)
p.start()
/tmp
上的life.py
:
def step():
return 'It works!'
运行test.py
:
$ python test.py
<function step at 0xb7dc4d4c>
running... It works!
$python test.py
跑步它起作用了!
我刚刚测试了一下,效果很好,所以你一定是做错了什么。请编辑您的问题并粘贴不起作用的真实代码
我将ubuntu Jaunty 9.04与默认python一起使用(python 2.6.2 release26 maint,2009年4月19日,01:56:41)。不知道您的问题是否仅限于windows,因为我没有可供测试的windows
这就是为什么弄乱导入路径是一个坏主意。您永远不会在所有平台/环境中都正确使用它,您的用户可能会生气。最好使用python查找模块的方法,即将模块放置在python模块搜索路径上。这将在任何地方都能持续工作。test.py
在任何文件夹上:
import multiprocessing
import imp
class MyProcess(multiprocessing.Process):
def __init__(self,thing):
multiprocessing.Process.__init__(self)
self.thing=thing
def run(self):
print 'running...', self.thing()
if __name__=="__main__":
module=imp.load_source('life', '/tmp/life.py')
thing=module.step
print(thing)
p=MyProcess(thing)
p.start()
/tmp
上的life.py
:
def step():
return 'It works!'
运行test.py
:
$ python test.py
<function step at 0xb7dc4d4c>
running... It works!
$python test.py
跑步它起作用了!
我刚刚测试了一下,效果很好,所以你一定是做错了什么。请编辑您的问题并粘贴不起作用的真实代码
我将ubuntu Jaunty 9.04与默认python一起使用(python 2.6.2 release26 maint,2009年4月19日,01:56:41)。不知道您的问题是否仅限于windows,因为我没有可供测试的windows
这就是为什么弄乱导入路径是一个坏主意。您永远不会在所有平台/环境中都正确使用它,您的用户可能会生气。最好使用python查找模块的方法,即将模块放置在python模块搜索路径上。这将在任何地方都能始终如一地工作。我刚刚完成了以下工作,使用Python 2.5在XP上运行
D:\Experiments\ModuleLoading\test.py
import imp
if __name__=="__main__":
module=imp.load_source('life', r'D:\Experiments\ModuleLoading\somefolder\life.py')
thing=module.step
print(thing)
def step():
return 'It works!'
D:\Experiments\ModuleLoading\somefolder\step.py
import imp
if __name__=="__main__":
module=imp.load_source('life', r'D:\Experiments\ModuleLoading\somefolder\life.py')
thing=module.step
print(thing)
def step():
return 'It works!'
…运行脚本将提供:
D:\jcage\Projects\Experiments\ModuleLoading>test.py
<function step at 0x00A0B470>
我刚刚完成了以下工作,使用Python 2.5在XP上运行
D:\Experiments\ModuleLoading\test.py
import imp
if __name__=="__main__":
module=imp.load_source('life', r'D:\Experiments\ModuleLoading\somefolder\life.py')
thing=module.step
print(thing)
def step():
return 'It works!'
D:\Experiments\ModuleLoading\somefolder\step.py
import imp
if __name__=="__main__":
module=imp.load_source('life', r'D:\Experiments\ModuleLoading\somefolder\life.py')
thing=module.step
print(thing)
def step():
return 'It works!'
…运行脚本将提供:
D:\jcage\Projects\Experiments\ModuleLoading>test.py
<function step at 0x00A0B470>
可能因为将导入代码放入主块,所以它不起作用。
下面的代码适用于Windows XP、Python 2.6。然后,生命模块也将在新流程中导入
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()
可能因为将导入代码放入主块,所以它不起作用。
下面的代码适用于Windows XP、Python 2.6。然后,生命模块也将在新流程中导入
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()
我复制了您的代码,只是将'/tmp/life.py'
更改为'tmp\\life.py'
,(我使用的是Windows XP)。我得到了一个回溯,我认为与我问题中的回溯相同,最后是pickle
模块。也许这只发生在Windows上?(注意:我使用的是Python 2.6.2c1)使用ubuntu Jaunty 9.04和默认Python(Python 2.6.2 release26 maint,2009年4月19日,01:56:41)。不知道它是否只是windows,我没有可以测试的windows。请注意,您也可以在windows上使用正向斜杠/tmp/life.py,无需将其更改为反向斜杠。我复制了您的代码,只是将'/tmp/life.py'
更改为'tmp\\life.py'
,(我使用的是windows XP)。我得到了一个回溯,我认为它与我问题中的回溯相同,最后是pickle
模块。也许这只发生在Windows上?(注意:我使用的是Python 2.6.2c1)使用ubuntu Jaunty 9.04和默认Python(Python 2.6.2 release26 maint,2009年4月19日,01:56:41)。不知道它是否只是windows,我没有可以测试的windows。请注意,您也可以在windows上使用正向斜杠/tmp/life.py,无需将其更改为反向斜杠。需要使用反斜杠,但在您的情况下,您不会碰巧有任何转义D:\foo\bar\qux\life.py'变为D:ooar\qux\life.py。改为使用r'D:\foo\bar\qux\life.py',它正确地变成了D:\foo\bar\qux\life.py。无论我使用\或\\,我都会收到相同的错误。显然,模块是在主进程中加载的:否则,print(thing)
将失败。需要反斜杠,但在您的情况下,不会发生任何转义D:\foo\bar\qux\life.py'变为D:ooar\qux\life.py。改为使用r'D:\foo\bar\qux\life.py',它正确地变成了D:\foo\bar\qux\life.py。无论我使用\或\\,我都会收到相同的错误。显然,模块正在主进程中加载:否则,print(thing)
将失败。