命令在终端中有效,但在传递给子进程时不起作用

问题描述 投票:0回答:1

我正在从事的项目正在尝试让黑色格式化程序在我们的预提交挂钩上运行。该命令在终端中有效,但在子进程中不起作用。

def run_black() -> None:
    """Runs black formatter."""
    cmd = ["git diff --cached --name-only --diff-filter=d", "|", "grep -E \\.py$", "|", "xargs", "black --skip-string-normalization"]
    subprocess.run(cmd, shell=True, check=True, text=True)

我故意进行了更改,以便 Black 进行格式化,但没有任何更改并且提交会通过。我也没有收到错误消息。我在终端上测试了该命令,它确实有效。 sys.executable 是 /usr/local/bin/python3 但是我的 python 环境是 /home/dev/opensource/.direnv/python-3.9.20/bin

python subprocess
1个回答
0
投票

对于这种硬编码管道,我将使用三个独立的子进程而不是 shell 管道。

cmd1 = ["git", "diff", "--cached", "--name-only", "--diff-filter=d"]
cmd2 = ["grep", "-E", "\\.py$"]
cmd3 = ["xargs", "black --skip-string-normalization"]

p1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE)
p2 = subprocess.Popen(cmd2, stdin=p1.stdout, stdout=subprocess.PIPE)
subprocess.run(cmd3, stdin=p2.stdout)

shell=True
和列表参数不能很好地协同工作。

© www.soinside.com 2019 - 2024. All rights reserved.