Python 3.x 从本地包调用Python多处理类时失败
我正在尝试编写一个包,其中包含一个利用多处理包的类。我将使用一个打印“Hello,person”的类来说明这个问题,其中person是字符串数组中的一个元素Python 3.x 从本地包调用Python多处理类时失败,python-3.x,ipython,packages,python-multiprocessing,Python 3.x,Ipython,Packages,Python Multiprocessing,我正在尝试编写一个包,其中包含一个利用多处理包的类。我将使用一个打印“Hello,person”的类来说明这个问题,其中person是字符串数组中的一个元素 class Hello: def __init__(self, people): self.people = people class _task(object): def __init__(self, person): self.person = person
class Hello:
def __init__(self, people):
self.people = people
class _task(object):
def __init__(self, person):
self.person = person
def __call__(self):
self.greet(self.person)
def greet(self, person):
print('Hello, {}'.format(person))
class _consumer(mp.Process):
def __init__(self, task_queue, result_queue):
mp.Process.__init__(self)
self.task_queue = task_queue
self.result_queue = result_queue
def run(self):
while True:
next_task = self.task_queue.get()
if next_task is None:
# poison pill
self.task_queue.task_done()
break
answer = next_task()
self.task_queue.task_done()
self.result_queue.put(answer)
def greet(self):
# establish communication queues
tasks = mp.JoinableQueue()
results = mp.Queue()
# start consumers
num_consumers = len(self.people)
consumers = [self._consumer(tasks, results)
for ii in range(num_consumers)]
for w in consumers:
w.start()
# enqueue jobs
for person in self.people:
tasks.put(self._task(person))
# add a poison pill for each consumer
for ii in range(num_consumers):
tasks.put(None)
# wait for tasks to finish
tasks.join()
此主脚本是test.py:
import hello
if __name__ == '__main__':
people = ['Alice', 'Bob', 'Clarissa', 'David', 'Elizabeth', 'Frank',
'Gertrude', 'Harry']
hi = hello.Hello(people)
hi.greet()
该包当前是一个文件夹的一部分,并在一层上排列
hello/
__init__ # from .hello_world import Hello
hello_world.py # contains class
test.py
如果从python控制台运行脚本test.py,我会得到预期的输出:
Hello, Alice
Hello, Bob
Hello, Clarissa
Hello, David
Hello, Elizabeth
Hello, Frank
Hello, Gertrude
Hello, Harry
如果我尝试从ipython控制台运行test.py,它将挂起,内核将显示错误
ImportError: No module named 'hello'
如果我将该类复制到test.py的顶部,只导入多处理并从python控制台或ipython控制台运行,那么我将获得正确的输出
我在Windows7上运行64位python 3。你可以在以下地址找到包裹
为什么这在ipython控制台中不起作用?首先要检查的是运行文件的两种方式之间的
sys.path
差异,如果它们相同,我希望没有区别,但ipython可能在不同的工作目录中启动。@TadhgMcDonald Jensen在执行脚本os.getcwd()时python和ipython控制台显示相同的内容,ipython控制台中的runfile命令采用正确的cwd。路径也基本相同,ipython控制台有一个额外的~\settings\ipython条目,但这不应该造成差异。首先要检查的是运行文件的两种方式之间的sys.path
差异,如果它们是相同的,我希望没有什么区别,但iPython可能在不同的工作目录中启动。@TadhgMcDonald Jensen在执行脚本时,os.getcwd()显示python和iPython控制台的相同内容,iPython控制台中的runfile命令使用正确的cwd。路径也基本相同,ipython控制台有一个额外的~\settings\ipython条目,但这不应该有什么区别。