代码之家  ›  专栏  ›  技术社区  ›  l0b0

从子进程分离matplotlib窗口

  •  5
  • l0b0  · 技术社区  · 14 年前

    我有一个 script 这将创建一个图形,但脚本将一直在后台运行,直到窗口关闭。我希望它在创建窗口后立即退出,这样shell中的Ctrl-C就不会终止窗口,这样用户就可以保持窗口打开并继续在shell中工作 bg multiprocessing 最简单的解决方案,还是有更短的?

    show() 命令是脚本执行的最后一个命令,因此我不需要以任何方式保留对窗口的引用。

    mian ... & 在巴什

    3 回复  |  直到 14 年前
        1
  •  3
  •   unutbu    14 年前

    这适用于Unix:

    import pylab
    import numpy as np
    import multiprocessing as mp
    import os
    
    def display():
        os.setsid()
        pylab.show()
    
    mu, sigma = 2, 0.5
    v = np.random.normal(mu,sigma,10000)
    (n, bins) = np.histogram(v, bins=50, normed=True)
    pylab.plot(bins[:-1], n)
    p=mp.Process(target=display)
    p.start()
    

    运行此脚本(从终端)时,将显示pylab图。按Ctrl-C键将终止主脚本,但仍保留绘图。

        2
  •  3
  •   Widjet    13 年前

    我建议使用os.fork()作为最简单的解决方案。它 守护进程中使用的技巧,但它不需要两个脚本,而且非常简单。例如:

    import os
    
    proc_num = os.fork()
    
    if proc_num != 0:
        #This is the parent process, that should quit immediately to return to the
        #shell.
        print "You can kill the graph with the command \"kill %d\"." % proc_num
        import sys
        sys.exit()
    
    #If we've made it to here, we're the child process, that doesn't have to quit.
    import matplotlib.pyplot as plt
    plt.plot([1,2,3],[4,5,6])
    plt.show()
    
        3
  •  3
  •   blaylockbk    8 年前

    刚在plt.show()中发现这个参数。设置block=False将弹出figure窗口,继续执行以下代码,并在脚本完成时将您留在解释器中(如果您在交互模式-i下运行)。

    plt.show(block=False)