2013-03-16 7 views
6

Chciałbym, aby Python tworzył wykres, wyświetlał go bez blokowania przepływu sterowania i pozostawił działkę otwartą po zakończeniu kodu. czy to możliwe?Otwórz okna macplotlib/pyplot otwarte po zakończeniu kodu

To i pokrewne tematy istnieją (patrz poniżej) w wielu innych wątkach, ale nie mogę uzyskać fabuły, aby pozostawały otwarte i nie były blokowane. Na przykład, jeśli użyję pyplot.ion() przed pyplot.show() lub jeśli użyję pyplot.show(block=False), fabuła zostanie zamknięta po zakończeniu kodu. Jest to prawdą, używając albo python lub ipython. Jeżeli ma to znaczenie, biegnę na OS X 10.8.2 (Mountain Lion), bieganie python27 i ipython27

Powiązane dyskusje:
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

Odpowiedz

6

W systemie Linux można odłącz wyświetlacz w następujący sposób:

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() 

Główny proces się kończy, ale wykres pozostaje.


Próba nr 2. Działa to również w systemie Linux; można spróbować: ale nie na 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) 

Bez os._exit(0), główne bloki procesowych. Naciśnięcie Ctrl-C zabija główny proces, ale wykres pozostaje.

Z os._exit(0) główny proces się kończy, ale wykres pozostaje.


Westchnienie. Próba nr 3. Jeśli postawisz połączeń matplotlib w innym scenariuszu, następnie można użyć podproces tak:

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]) 

Running test.py powinien wyświetlić wykres i przywrócić kontrolę do terminala, pozostawiając wyświetlony wykres.

+0

Daje mi to: 'Proces rozwidlał się i nie można bezpiecznie używać tej funkcji CoreFoundation. MUSISZ exec(). Przerwij __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY ___ YOU_MUST_EXEC __() w celu debugowania. ' – DilithiumMatrix

+0

Przeprosiny. Najwyraźniej to rozwiązanie jest specyficzne dla systemu Linux. – unutbu

+0

Doceń próbę – DilithiumMatrix

-1

Chociaż może to nie odpowiadać bezpośrednio na pytanie, najłatwiejszą praktyczną rzeczą, jaką znalazłem, jest (użycie show (blok = False) i) uruchomienie skryptu w tle. W ten sposób wątek pozostanie i powrócisz do znaku zachęty powłoki, a skrypt wyjdzie po zabiciu okna wykresu ...

Powiązane problemy