/bin/sh - Python中的非交互式使用

1 投票
2 回答
638 浏览
提问于 2025-04-16 19:25

我在Python中这样调用命令行(cmd):

subpocess.Popen(['coffee'], shell=True)

我认为这可以理解为:

/bin/sh -c "coffee"

根据我读过的文档,在非交互模式下,像 /etc/profile 和 /etc/bash.bashrc 这样的文件不会被读取,而是使用默认的 $PATH(初始化 $PATH)。我这样理解对吗?要把 coffee 加入到 $PATH,唯一的方法就是把它复制到 /usr/local/bin 吗?

2 个回答

2

历史上,对于以非交互方式启动的命令,系统不会读取任何启动文件,因为可以认为环境已经设置好了。

像Python、shell等几乎所有东西都会把现有的环境,或者至少是PATH这个环境变量,传递给子shell。因此,从某种意义上说,你已经执行了.profile或者bash的扩展。(因为这些在用户登录时就已经运行过,其他进程也继承了修改后的PATH。)

你可以选择的选项有:

  • /etc/profile中为所有系统用户指定一个路径
  • 要求用户提供合适的PATH设置(你会继承这些设置)
  • 使用完整路径名运行子进程工具
  • 把所有命令放在已经在PATH中的目录里
2

不,命令行会从Python解释器那里继承PATH,也就是说,它会是os.getenv('PATH')的值。此外,你可以在命令中设置路径:

subprocess.Popen(['PATH=/where/ever/bin:$PATH coffee'], shell=True)

不过我真的建议你要么使用coffee的完整路径,要么在运行你的Python程序之前先设置好PATH

撰写回答