通过文件路径导入模块时使用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)
将失败。