Python 3.x 从本地包调用Python多处理类时失败

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

我正在尝试编写一个包,其中包含一个利用多处理包的类。我将使用一个打印“Hello,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条目,但这不应该有什么区别。