2013-03-16 8 views
6

Ich möchte, dass Python ein Plot macht, es anzeigen, ohne den Kontrollfluss zu blockieren und das Plot offen lassen, nachdem der Code beendet wurde. Ist das möglich?keep matplotlib/pyplot Fenster geöffnet nach der Code-Beendigung

Diese und verwandte Themen existieren (siehe unten) in zahlreichen anderen Threads, aber ich kann die Handlung nicht sowohl offen als auch nicht blockierend erhalten. Wenn ich zum Beispiel pyplot.ion() vor pyplot.show() verwende, oder wenn ich pyplot.show(block=False) verwende, schließt das Diagramm, wenn der Code beendet wird. Dies trifft entweder auf python oder ipython zu. Wenn es darauf ankommt, ich laufe auf O X 10.8.2 (Mountain Lion), Laufen python27 und ipython27

ähnliche Diskussionen:
pylab matplotlib "show" waits until window closes
Is there a way to detach matplotlib plots so that the computation can continue?
Keep plotting window open in Matplotlib
Closing pyplot windows

Antwort

6

Unter Linux können Sie Trennen Sie die Anzeige auf diese Weise:

import matplotlib.pyplot as plt 
import matplotlib.mlab as mlab 
import numpy as np 
import os 

def detach_display(): 
    mu, sigma = 0, 0.5 
    x = np.linspace(-3, 3, 100) 
    plt.plot(x, mlab.normpdf(x, mu, sigma)) 
    plt.show()  

if os.fork(): 
    # Parent 
    pass 
else: 
    # Child 
    detach_display() 

Der Hauptprozess endet, aber die Handlung bleibt.


Versuch # 2. Dies funktioniert auch unter Linux; Sie könnten es versuchen: aber nicht auf OS X.

import matplotlib.pyplot as plt 
import matplotlib.mlab as mlab 
import numpy as np 
import os 
import multiprocessing as mp 

def detach_display(): 
    mu, sigma = 0, 0.5 
    x = np.linspace(-3, 3, 100) 
    plt.plot(x, mlab.normpdf(x, mu, sigma)) 
    plt.show() 

proc = mp.Process(target=detach_display) 
proc.start() 
os._exit(0) 

Ohne die os._exit(0), die wichtigsten Prozessblöcke. Durch Drücken von Strg-C wird der Hauptprozess beendet, das Diagramm bleibt jedoch erhalten.

Mit der os._exit(0) endet der Hauptprozess, aber die Handlung bleibt.


Seufz. Versuch # 3. Wenn Sie Ihre matplotlib Anrufe in einem anderen Skript platzieren, dann könnte man subprocess wie folgt verwenden:

show.py:

import matplotlib.pyplot as plt 
import numpy as np 
import sys 

filename = sys.argv[1] 
data = np.load(filename) 
plt.plot(data['x'], data['y']) 
plt.show()  

test.py

import subprocess 
import numpy as np 
import matplotlib.mlab as mlab 

mu, sigma = 0, 0.5 
x = np.linspace(-3, 3, 100000) 
y = mlab.normpdf(x, mu, sigma) 
filename = '/tmp/data.npz' 
np.savez(filename, x=x, y=y) 
proc = subprocess.Popen(['python', '/path/to/show.py', filename]) 

test.py Rennen sollte ein Grundstück anzuzeigen und Rückgabe der Kontrolle an das Terminal, während das Diagramm angezeigt wird.

+0

Das gibt mir: 'Der Prozess hat sich verzweigt und Sie können diese CoreFoundation-Funktionalität nicht sicher verwenden. Sie müssen exec(). Break auf __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY ___ YOU_MUST_EXEC __() zu debuggen. ' – DilithiumMatrix

+0

Entschuldigung. Offensichtlich ist diese Lösung Linux-spezifisch. – unutbu

+0

Schätzen Sie den Versuch – DilithiumMatrix

-1

Obwohl dies die Frage nicht direkt beantworten kann, ist die einfachste praktische Sache, die ich gefunden habe, (verwenden Sie show (block = False) und) führen Sie das Skript im Hintergrund. Auf diese Weise bleiben die Plot (s) und Sie sind zurück an der Shell-Eingabeaufforderung und das Skript wird beendet, wenn Sie das Plot-Fenster ...

Verwandte Themen