多处理无法使用cmd2模块,导入问题?

时间:2015-04-28 20:21:06

标签: python import cmd multiprocessing importerror

从这个问题Multiprocessing code works upon import, breaks upon being called扩展解决方案,我已经在我的项目中注入了一些多处理代码,这些代码已经迅速破解。

我认为存在进口问题。我有两个模块。 test.py看起来像:

print 'omnia praeclara'
import multi4
if __name__ == "__main__":
    multi4.init_manager()
print 'rara sunt'   

multi4.py看起来像:

import multiprocessing as mp
def add():
    print 2+2
def init_manager():
    proc = mp.Process(target=add)
    proc.start()
    proc.join()

现在,这段代码运行正常。从命令行(Windows)运行时,它会生成以下内容:

omnia praeclara
omnia praeclara
rara sunt
4
rara sunt

这是预期的(双重打印在上面的链接中解释)。

但是,当我这样做test.py时:

print 'omnia praeclara'
import multi4
if __name__ == "__main__":
    multi4.init_manager()
print 'rara sunt'   

import cmd2
class Prompt(cmd2.Cmd):

    def default(self, line):
        return cmd2.Cmd.default(self, line)
    prompt = '\n+++ '
    intro = '\n by that remembered or with that forgot.'
    def do_exit(self, line):
        return True

Prompt().cmdloop()

我得到了

omnia praeclara
omnia praeclara
rara sunt
by that remembered or with that forgot.
+++

这是cmd2模块的命令提示符。调用add的过程不会产生任何结果。它现在挂了。如果我在提示中键入exit,我会:

+++ exit
4
rara sunt

by that remembered or with that forgot.
+++

所以多处理代码完成了,但是现在我回到我的cmd2提示符中了!只有当我再次退出时才真正退出。

显然,一切都是进口两次。这在上面的链接中被引用,但是有什么办法可以避免这种情况吗?更重要的是,我在cmd2做什么时,如何让我的流程在后台运行?

1 个答案:

答案 0 :(得分:1)

这与导致双重打印的问题相同 - test.py未受if __name__ == "__main__":后卫保护的任何内容都将在父进程和子进程中执行。您需要将呼叫移至警卫下的Prompt().cmdloop()以防止其在儿童中执行:

print 'omnia praeclara'
import multi4

print 'rara sunt'   
import cmd2

class Prompt(cmd2.Cmd):

    def default(self, line):
        return cmd2.Cmd.default(self, line)
    prompt = '\n+++ '
    intro = '\n by that remembered or with that forgot.'
    def do_exit(self, line):
        return True

if __name__ == "__main__":
    multi4.init_manager()
    Prompt().cmdloop()