使用子进程查询 Git 状态会在 Linux 下抛出错误
Querying Git status with Subprocess throws Error under Linux
我想使用 python 查询 git 存储库的状态。我正在使用:
subprocess.check_output("[[ -z $(git status -s) ]] && echo 'clean'", shell=True).strip()
这在 MacOS 上运行良好。但是,在 Ubuntu Linux 我收到一条错误消息:
{CalledProcessError}Command '[[ -z $(git status -s) ]] && echo 'clean'' returned non-zero exit status 127.
我进入同一个文件夹并手动 运行
[[ -z $(git status -s) ]] && echo 'clean'
而且效果很好。
我进一步 运行 其他命令,例如
subprocess.check_output("ls", shell=True).strip()
这也很好。
这里出了什么问题?
当您设置 shell=True
时,subprocess
使用 /bin/sh
执行您的命令。在 Ubuntu 上,/bin/sh
不是 Bash,并且您使用的是 Bash-specific 语法 ([[...]]
)。您可以显式调用 bash
而不是:
subprocess.check_output(["/bin/bash", "-c", "[[ -z $(git status -s) ]] && echo 'clean'"]).strip()
但不清楚你为什么要在这里使用 shell 脚本:只是 运行 git status -s
和 Python,然后自己处理结果:
out = subprocess.run(['git', 'status', '-s'], stdout=subprocess.PIPE)
if not out.stdout:
print("clean")
我想使用 python 查询 git 存储库的状态。我正在使用:
subprocess.check_output("[[ -z $(git status -s) ]] && echo 'clean'", shell=True).strip()
这在 MacOS 上运行良好。但是,在 Ubuntu Linux 我收到一条错误消息:
{CalledProcessError}Command '[[ -z $(git status -s) ]] && echo 'clean'' returned non-zero exit status 127.
我进入同一个文件夹并手动 运行
[[ -z $(git status -s) ]] && echo 'clean'
而且效果很好。
我进一步 运行 其他命令,例如
subprocess.check_output("ls", shell=True).strip()
这也很好。
这里出了什么问题?
当您设置 shell=True
时,subprocess
使用 /bin/sh
执行您的命令。在 Ubuntu 上,/bin/sh
不是 Bash,并且您使用的是 Bash-specific 语法 ([[...]]
)。您可以显式调用 bash
而不是:
subprocess.check_output(["/bin/bash", "-c", "[[ -z $(git status -s) ]] && echo 'clean'"]).strip()
但不清楚你为什么要在这里使用 shell 脚本:只是 运行 git status -s
和 Python,然后自己处理结果:
out = subprocess.run(['git', 'status', '-s'], stdout=subprocess.PIPE)
if not out.stdout:
print("clean")