subprocess.open执行shell脚本识为什么别不到git命令?

有以下一段python的伪代码

cmd = "xxx.sh"
workdir="/xxx/xxx/xxx"
with open('./out.log', 'a') as log:
    p = subprocess.Popen(cmd, shell=True, stdout=log, stderr=subprocess.STDOUT, cwd=workdir)

在这个xxx.sh文件里, 有如下一些脚本

...
git pull
npm run build
...

这种结果就是git命令识别不到, git: command not found, 但是npm命令可以执行成功

将其改为
/usr/local/git-2.31.1/bin/git pull
可以执行成功, git命令执行成功了

这是什么道理? 如何优雅解决

对python 不太熟悉

阅读 1.3k
1 个回答

这个就是环境变量的问题,不是python的问题。

应该是因为git安装的位置不在:环境变量PATH所包含的目录中

是因为通过subprocess启动的程序,不会去加载.bashrc.profiles ... 这些shell的配置文件,所以PATH内容就是shell默认的环境变量。

通常都会包含这些目录:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin,如果执行文件不在这些目录里,执行的时候都会找不到。

所以有两个解决办法:
方法1: 在/usr/local/bin目录里,添加一个软链接 ln -s /path/to/git /usr/local/bin/git,这样git,就被包含在PATH目录里面了,这里/usr/local/bin换成其他的也可以。
方法2: 在脚本里面设置 PATH 环境变量,把git执行文件的所在路径加上去

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题