2013-03-16 3 views
6

파이썬이 플롯을 만들고, 제어 흐름을 차단하지 않고 표시하고, 코드가 종료 된 후에 플롯을 열어 둘 수 있기를 바랍니다. 이것이 가능한가?코드 종료 후 matplotlib/pyplot 창을 열어 두십시오.

이 주제와 관련된 주제가 다른 많은 스레드에 존재하지만 (아래 참조) 두 줄을 모두 열어 둘 수는 없습니다. 예를 들어, 을 pyplot.show() 전에 사용하거나 을 사용하면 코드가 종료되면 플롯이 닫힙니다. 이는 python 또는 ipython을 사용하면 사실입니다. 당신이 할 수있는 리눅스에
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

답변

6

:이 중요한 경우에, 나는 python27ipython27

관련 논의를 실행, OS X 10.8.2 (산 사자)에 실행 해요 다음과 같이 디스플레이를 분리하십시오 :

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

주 프로세스가 종료되지만 플롯이 유지됩니다.


시도 # 2. 이것은 Linux에서도 작동합니다. 당신은 그것을 시도 줄 수 있습니다는 os._exit(0)없이 주요 공정 블록을 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) 

하지만합니다. Ctrl-C를 누르면 주 프로세스가 종료되지만 플롯은 그대로 유지됩니다.

os._exit(0)을 사용하면 주 프로세스가 종료되지만 플롯이 유지됩니다.


한숨. 시도 # 3. 다른 스크립트에서하기 matplotlib에 전화를 걸 경우에, 당신은 다음과 같은 하위 프로세스를 사용할 수 있습니다

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을 실행하고 플롯이 표시된 상태에서 터미널로 제어를 되돌립니다.

+0

이렇게하면 다음과 같은 메시지가 나타납니다. '프로세스가 분기되고 사용자는이 CoreFoundation 기능을 안전하게 사용할 수 없습니다. 반드시 exec()해야합니다. 디버깅하려면 __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY ___ YOU_MUST_EXEC __()을 중단하십시오. ' – DilithiumMatrix

+0

사과. 외관상으로는이 해결책은 리눅스 특유하다. – unutbu

+0

시도해 주셔서 감사합니다. – DilithiumMatrix

-1

이 질문에 직접 대답하지는 않지만 내가 발견 한 가장 쉬운 실용적인 방법은 show (block = False)를 사용하여 백그라운드에서 스크립트를 실행하는 것입니다. 그런 식으로 플롯이 남아 있고 플롯 창을 닫을 때 쉘 프롬프트에서 스크립트가 종료됩니다 ...

관련 문제