Графики Matplotlib не отображаются в сублимтексте

Недавно я начал использовать sublimetext 2, однако сегодня я заметил, что функция plt.show() не работает при запуске в sublimetext.

Если, например, я создам следующий скрипт:

import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.show() 

Запуск этого с IDLE генерирует график, однако при использовании сублимтекста вывод не генерируется. Он просто продолжает «думать», пока я не завершу процесс python.exe, после чего выводится [Finished].

Я неправильно понял, как должен использоваться сублимтекст?

Спасибо.


person iRoygbiv    schedule 31.05.2012    source источник
comment
Как вы выполняете скрипт в Sublime Text? На какой платформе вы находитесь?   -  person noio    schedule 31.05.2012
comment
Я не уверен, что вы имеете в виду, я просто нажал f5.   -  person iRoygbiv    schedule 31.05.2012
comment
Я использую Sublime Text 3 build 3156 в Windows (и версию 3143 в CentOS). Код отлично работает в обеих системах. Окна изображений отображаются после того, как мы нажмем Ctrl+B для выполнения скрипта.   -  person jdhao    schedule 18.12.2017


Ответы (5)


Я предполагаю, что Sublime Text 2 запускает ваш код в своей собственной среде и только перехватывает и отображает вывод консоли. Та же проблема возникает при использовании графических интерфейсов, таких как wxPython.

Другой обходной путь — открыть командную строку и запустить ее вручную (python file.py).

EDIT: Здесь говорится, что "в Windows графический интерфейс пользователя подавляется".

РЕДАКТИРОВАНИЕ 2: Здесь указан способ исправить это, прямо внизу страницы.

person Gareth Webber    schedule 31.05.2012
comment
Большое спасибо! Это сработало для меня после нескольких часов гугления! - person Fractaly; 16.07.2015

Более подходящий способ - просто добавить одну строку в системный файл сборки Python по умолчанию:

"shell": true

Или создайте дополнительную систему сборки Python с помощью:

{
    "cmd": ["python", "-u", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python",
    "shell": true
}
person theta    schedule 17.03.2013
comment
У меня это работает, но в Windows я получаю следующее сообщение: CMD.EXE был запущен с указанным выше путем в качестве текущего каталога. Пути UNC не поддерживаются. По умолчанию каталог Windows. Проблема в том, что время от времени сборка вылетает из редактора. - person jfosoriot; 19.09.2018
comment
Для Windows файловая переменная должна быть заключена в скобки следующим образом: cmd: [python, -u, ${file}], таким образом вы избежите получения предупреждения о пути UNC. - person jfosoriot; 19.09.2018

Я попробовал тета-ответ, как было предложено выше. Это работает нормально. Если консоль открывается и закрывается мгновенно, как при запуске файлов Python непосредственно из проводника, просто добавьте следующую строку в конце:

matplotlib.pyplot.show('hold')

Первый раз отвечаю здесь. Извините, если я не придерживался формата ответа.

person bala83    schedule 03.09.2015
comment
это должен быть правильный ответ. Он держит окно графика открытым, не изменяя среду разработки. - person nazikus; 26.07.2016
comment
MatplotlibDeprecationWarning: позиционная передача параметра блока show() устарела, начиная с Matplotlib 3.1; параметр станет доступным только для ключевых слов в версии 3.3. - person Amir Samakar; 24.04.2020

Примечание в возвышенном тексте 3 (с установленным пакетом anaconda)

Вам нужно добавить пользовательскую систему сборки, как сказал тета, с помощью:

сначала добавьте папку с именем python в \path\to\Sublime Text Build XXXX\Data\Packages

затем поместите файл с именем python.sublime-build в эту папку.

{
    "cmd": ["python", "-u", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python",
    "shell": true
}

и не забудьте добавить plt.show(), как сказал Роальд.

plt.imshow(image)
plt.show()

Демо:

введите описание изображения здесь

person 応振强    schedule 24.12.2017

У меня была аналогичная проблема в Ubuntu. Я пытался построить pandas DataFrame вот так:

df = pandas.DataFrame([*range(5)])
df.plot()

Но сюжета не показали. Оказывается, вам нужно сделать plt.show(), как обсуждалось здесь.

person Roald    schedule 15.10.2017