Как заставить 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