Как заставить PyCharm pipe выводить программу Python через другую программу текстового процессора

Я не нашел способа, чтобы PyCharm pipe обрабатывал вывод моей программы на Python. В частности, я использую bunyan ( Python Bunyan, перенесенный из Node Bunyan) из моей программы, он генерирует журнал JSON для stderr:

Код Python:

logger.info({'nick': 'Duke', 'age': 30, 'expertise': ['Java', 'Javascript', 'Python']},
            'Hi %(nick)s, your expertise recorded!');

Необработанная продукция:

cymp:scratches cyue$ python logging-wander.py 
{"name": "__main__", "expertise": ["Java", "Javascript", "Python"], "nick": "Duke", "age": 30, "time": "2016-08-02T18:16:12Z", "msg": "Hi Duke, your expertise recorded!", "hostname": "cymp.local", "level": 30, "pid": 1418, "v": 0}

Труба обрабатывается на выходе:

cymp:scratches cyue$ python logging-wander.py 2>&1 | bunyan
[2016-08-02T18:16:15Z]  INFO: __main__/1419 on cymp.local: Hi Duke, your expertise recorded! (nick=Duke, age=30)
    expertise: [
      "Java",
      "Javascript",
      "Python"
    ]

Выходные данные передаются в инструмент командной строки bunyan для красивой печати (в терминалах есть даже цвета, но здесь они не показаны).

В WebStorm для js я могу добавить локальный сценарий оболочки в качестве "интерпретатора узла" для выполнения этой работы, но для PyCharm у них нет опции "Добавить" для "интерпретатора Python" в диалоговом окне "Запуск / отладка конфигурации", и он жалуется The selected file is not a valid home for PythonSDK когда я пытаюсь добавить сценарий оболочки как "Project Interpreter".

Интересно, какой обходной путь может быть использован для достижения желаемого результата?

1 ответ

Решение

Обновление: у меня получилось лучшее (в моем смысле) решение: создать стартовый файл заглушки python run-module.py лайк:

#!/usr/bin/env python

import os
import sys
import subprocess
import runpy

real_stderr = sys.stderr

if len(sys.argv) < 2:
    raise Exception('module name is required')

try:
    bi, bo = os.pipe()
    sys.stderr = os.fdopen(bo, 'w')
    subprocess.Popen(['bunyan', '--color'], stdin=bi, stderr=real_stderr)

    modu_name = sys.argv[1]
    sys.argv = sys.argv[1:]  # shift off run-module.py, argv[0] will be replaced by module's __main__
    runpy.run_module(modu_name, alter_sys=True)
except NameError:
    print('sys.path => %r' % sys.path, file=real_stderr)
    raise
except:
    import traceback

    traceback.print_exc(file=real_stderr)
    raise

Затем запустите эту заглушку в качестве сценария с реальным именем модуля в качестве первого аргумента.

Хорошо, наконец-то я сделал плагин IntelliJ для решения этой проблемы. BunyanConsole Pretty Print в то время как исходный код на GitHub BunyanConsole

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

Другие вопросы по тегам