【问题标题】:Why ripgrep results from python subprocess run differ from rg run in the shell为什么 python 子进程运行的 ripgrep 结果与 shell 中的 rg 运行不同
【发布时间】: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


【解决方案1】:

因为 ripgrep 检测 stdout 上是否存在交互式 tty,如果存在,则将输出格式更改为更“友好”。例如,ls 所做的事情是一样的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2016-04-05
    • 2010-12-18
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多