Подтвердить что ты не робот

После запуска script удерживайте фигуру "на удержании",

У меня есть этот код Python:

from pylab import *
from numpy import *

time=linspace(-pi,pi,10000)
ycos=cos(time)
ysin=sin(time)

plot(time,ycos)
plot(time,ysin)

show()

Если я сделаю все эти шаги через терминал Ipython, я могу держать фигуру открытой и взаимодействовать с ней. Однако, если я запустил script через $python script.py, эта цифра открывается и закрывается мгновенно.

Как я могу иметь такое же поведение, что и терминал Ipython, но при запуске как script?

4b9b3361

Ответ 1

Вот более разумный ответ после быстрого изучения проблемы.

Сначала предположим, что

from matplotlib import pylab
pylab.plot(range(10), range(10))
pylab.show()

не "удерживает" график, т.е. пока он не показан до завершения программы. Если это произойдет, тогда вызов pylab.show() предположил, что вы работаете в интерактивном режиме, поэтому происходит еще один процесс, который будет продолжаться после вызова этой функции. Так как это не так, Python завершает работу и отображает график. Теперь первый подход к решению этого вопроса заключается в том, чтобы заставить pylab.show блокировать:

pylab.show(block=True)

Тем не менее, мы не знаем, почему pylab.show предположил, что вы работаете в интерактивном режиме. Чтобы подтвердить свое предположение, эксперимент, выполняющий следующий код

import matplotlib
print matplotlib.is_interactive()

если это печатает True, значит, ваша настройка по умолчанию установлена ​​на interactive: True. Чтобы проверить, какая именно конфигурация, выполните print matplotlib.matplotlib_fname(), чтобы узнать путь к ней. Откройте его и проверьте значение для параметра interactive.

Теперь, если вы предпочитаете не изменять конфигурацию, я предлагаю другое решение:

import matplotlib
from matplotlib import pylab

if matplotlib.is_interactive():
    pylab.ioff()
pylab.plot(range(10), range(10))
pylab.show()

поэтому нет ситуации, когда matplotlib думает, что он должен отображать материал перед вызовом метода show. Наконец, самым ужасным из этих решений будет использование pylab.pause или эквивалентов:

from matplotlib import pylab
pylab.ion()  # Force interactive    
pylab.plot(range(10), range(10))
pylab.show() # This does not block
pylab.pause(2**31-1)