jupyter notebook против консоли jupyter: отображение объектов уценки (и латекса, html и т. д.) - PullRequest
0 голосов
/ 19 ноября 2018

Я хотел бы также иметь возможность запускать блокнот jupyter как обычный файл python (используя стандартный интерпретатор python).проблема, с которой я сталкиваюсь, заключается в том, что в python я не могу отобразить объекты уценки в удобном для использования из:

выполнении кода, приведенного ниже, отображается так, как должно быть в записной книжке, но печатает <IPython.core.display.Markdown object> при запуске с использованием только Python.

from IPython.display import Markdown, display
display(Markdown('# Hello World!'))

Я пытался придумать способ сделать эту работу и нашел этот уродливый обходной путь:

from IPython.display import Markdown, display
from IPython import get_ipython
from IPython.core.displaypub import DisplayPublisher
from ipykernel.zmqshell import ZMQDisplayPublisher

display_pub_class = get_ipython().display_pub_class()

def displaymd(strg):
    if isinstance(display_pub_class, ZMQDisplayPublisher):
        display(Markdown(strg))
    elif isinstance(display_pub_class, DisplayPublisher):
        print(strg)
    else:
        # ??
        display(strg)

displaymd('# Hello World!')

, который кажется очень хакерским!Есть ли более простой способ получить разумные display объектов уценки?или, по крайней мере, более простой способ узнать, способен ли display отрисовывать уценку?

тот же вопрос касается латекса, html и подобных объектов.


только что обнаружил глупоболее простой способ проверить, нахожусь ли я на ipython:

def on_ipython():
    if 'get_ipython' in globals():
        return True
    else:
        return False

def displaymd(strg):
    if on_ipython():
        display(Markdown(strg))
    else:
        print(strg)

все же это не очень приятно ...

1 Ответ

0 голосов
/ 21 декабря 2018

Вариант 1: диктовки с записями 'text / plain' и 'text / markdown'

Вы можете передать dict, содержащий различные типы MIME, в IPython display(..., raw=True): Jupyter Notebook будет использовать расширенное представление, а внешний интерфейс IPython или простой Python вернется к представлению text/plain.

Вот минимальный законченный пример; попробуйте запустить его в терминале IPython и в блокноте Jupyter, и вы увидите, что он правильно отображается в обоих случаях.

from IPython.display import display


my_markdown_string = '''\
# Heading one

This is

* a
* list
'''

display({'text/plain': my_markdown_string,
         'text/markdown': my_markdown_string},
        raw=True)

Вариант 2: определение пользовательского средства форматирования текста / обычного текста для объектов класса Markdown

Пример основан на примере «определить новый форматер int» из документа IPython display. Вы захотите запустить его в IPython, чтобы увидеть его эффект.

from IPython.display import display, Markdown

def md_formatter(md, pp, cycle):
    pp.text(md.data)

text_plain = get_ipython().display_formatter.formatters['text/plain']
text_plain.for_type(Markdown, md_formatter)

display(Markdown('x **x** x'))
# x **x** x

del text_plain.type_printers[Markdown]
display(Markdown('x **x** x'))
# <IPython.core.display.Markdown object>

Приложение: список типов MIME, о которых Jupyter / IPython знает

Взято из DisplayFormatter документы:

См. Сообщение display_data в документации по обмену сообщениями для подробнее об этом типе сообщения.

В настоящее время реализованы следующие типы MIME:

  • текст / обычный
  • Текст / HTML
  • текст / уценки
  • текст / латекс
  • применение / JSON
  • применение / JavaScript
  • изображение / PNG
  • изображение / JPEG
...