如何通过另一个文本处理器程序使PyCharm管道python程序输出

时间:2016-08-01 21:15:23

标签: pycharm

我发现没有办法让PyCharm管道处理我的Python程序的输出。具体来说,我在我的程序中使用bunyan(从Python Bunyan移植的Node Bunyan),它生成JSON日志到stderr:

Python代码:

<table>
<tr><th>Header 1</th><th>Header 2</th><th>Header 3</th><th>Header 4</th></tr>
<tr><td>1</td><td>XYZ</td><td>456</td><td>0</td></tr>
<tr class="inside"><td colspan="4">Inside text</td></tr>
<tr><td>859</td><td>IOI</td><td>132</td><td>9</td></tr>
<tr class="inside"><td colspan="4">Inside text</td></tr>
<tr class="inside"><td colspan="4">Another inside text</td></tr>
<tr><td>798</td><td>GJOI</td><td>798</td><td>12</td></tr>
<tr class="inside"><td colspan="4">Inside text</td></tr>
</table>

原始输出:

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}

输出通过管道连接到bunyan的命令行工具进行漂亮的打印(终端中甚至有颜色,但这里没有显示)。

在WebStorm for js中,我可以添加一个本地shell脚本作为“节点解释器”来完成这项工作,但是对于PyCharm,他们在“运行/调试配置”对话框中没有'添加'选项'Python解释器',当我尝试将shell脚本添加为“Project Interpreter”时,它会抱怨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" ]

我想知道可以使用任何解决方法来获得我想要的结果吗?

1 个答案:

答案 0 :(得分:0)

更新: 我最终得到了一个更好的(在我看来)解决方案:制作一个启动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

然后将此存根作为脚本运行,实际模块名称为第一个arg。

好的,最后我DIY一个IntelliJ插件来解决这个问题。 BunyanConsole Pretty Print 而GitHub上的源代码BunyanConsole

enter image description here