【发布时间】:2021-12-29 16:44:40
【问题描述】:
如果我直接在 bash 中运行 rg,则输出信息包括找到的文件名(在单独的行上),然后在每个匹配的单独行上显示该匹配的行号和内容:
11:38 (main *+) durl $ rg format
durl/__main__.py
35: print(util.format_output(repo.url, line))
38: print(util.format_output(repo.url, line, linenumber=n))
durl/util.py
15:def format_output(prefix, filename: str, linenumber: str=None) -> str:
但是如果我从 python subprocess run 运行相同的命令,匹配结果的显示信息包括每行的文件名,不包括行号。为什么呢? (我在 MacOS 上运行)
11:38 (main *+) durl $ ipython
Python 3.9.5 (default, May 4 2021, 03:36:27)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.27.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import subprocess
In [2]: p = subprocess.run('rg format', text=True, shell=True, capture_output=True,)
In [3]: p.stdout
Out[3]: 'durl/__main__.py: print(util.format_output(repo.url, line))\ndurl/__main__.py: print(util.format_output(repo.url, line, linenumber=n))\ndurl/util.py:def format_output(prefix, filename: str, linenumber: str=None) -> str:\n'
In [4]: p.stdout.split('\n')
Out[4]:
['durl/__main__.py: print(util.format_output(repo.url, line))',
'durl/__main__.py: print(util.format_output(repo.url, line, linenumber=n))',
'durl/util.py:def format_output(prefix, filename: str, linenumber: str=None) -> str:',
'']
【问题讨论】:
-
在你的 shell 中尝试
rg format | cat并与单独的rg format进行比较。 -
(另外,请不要让读者的问题来试图弄清楚您要问的具体区别是什么;它并不像您认为的那样直观,文件名只是在 stdout-to-a-FIFO 案例中的每一行都复制了;我不得不重读几次才能抓住它,而一个回答者显然完全错过了它——现在已经编辑得更明确了)。
-
顺便说一句,如果你放弃了
capture_output=True,你会有相同的行为(因为rg会从 Python 继承标准输出,因此会看到输出到 TTY,因此优化人类友好的行为,而不是机器友好的行为)。
标签: python python-3.x subprocess ripgrep