Я только что сделал следующее, работая на XP с Python 2.5 ...
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)
D:\Experiments\ModuleLoading\somefolder\step.py
def step():
return 'It works!'
... и запуск скрипта дает:
D:\jcage\Projects\Experiments\ModuleLoading>test.py
<function step at 0x00A0B470>
... так попробуйте сначала и убедитесь, что модуль может загружаться без многопроцессорной обработки?
[Редактировать] Хорошо, это определенно проблема с импортом в раздвоенный процесс. В документации есть несколько фрагментов, относящихся к windows :
Больше маринованности
Убедитесь, что все аргументы Process .__ init __ () доступны для выбора. Это означает, в частности, что связанные или несвязанные методы нельзя использовать непосредственно в качестве целевого аргумента в Windows - просто определите функцию и используйте ее вместо этого.
Кроме того, если вы создаете подкласс Process, убедитесь, что экземпляры можно будет выбирать при вызове метода Process.start ().
Глобальные переменные
Имейте в виду, что если код, запущенный в дочернем процессе, пытается получить доступ к глобальной переменной, то значение, которое он видит (если он есть), может не совпадать со значением в родительском процессе в тот момент, когда Process.start ( ) назывался.
Однако глобальные переменные, которые являются только константами уровня модуля, не вызывают проблем.
Безопасный импорт основного модуля
Убедитесь, что основной модуль может быть безопасно импортирован новым интерпретатором Python, не вызывая непреднамеренных побочных эффектов (таких как запуск нового процесса).
[Edit2] Есть ли причина, по которой вы не можете выполнить импорт в процессе? Я думаю, проблема в том, что когда вы запускаете новый процесс, он не работает в том же адресном пространстве, поэтому попытка доступа к функциям в исходном потоке не будет работать.
Вы можете сделать это для D:\Experiments\ModuleLoading\test.py
вместо:
from multiprocessing import Process
import imp
class MyProcess(Process):
def __init__(self):
Process.__init__(self)
def run(self):
print 'run called...'
module=imp.load_source('life', r'D:\Experiments\ModuleLoading\somefolder\life.py')
print 'running...', module.step()
if __name__=="__main__":
p=MyProcess()
p.start()