/bin/sh - Python中的非交互式使用
我在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
。