我发现没有办法让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"
]
。
我想知道可以使用任何解决方法来获得我想要的结果吗?
答案 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
德尔>