/bin/sh-Python的非交互式用法

/bin/sh-Python的非交互式用法,python,shell,Python,Shell,我从Python中调用cmd,如下所示: subpocess.Popen(['coffee'], shell=True) 我相信这可以翻译成: /bin/sh -c "coffee" 我从文档中读到,在非交互模式下,像/etc/profile、/etc/bash.bashrc这样的文件不会被读取,而是使用默认的$PATH(init$PATH)。我说得对吗?将coffee添加到$PATH的唯一方法是将其复制到/usr/local/bin吗?否,shell将从Python解释器继承路径,即它将是

我从Python中调用cmd,如下所示:

subpocess.Popen(['coffee'], shell=True)
我相信这可以翻译成:

/bin/sh -c "coffee"

我从文档中读到,在非交互模式下,像/etc/profile、/etc/bash.bashrc这样的文件不会被读取,而是使用默认的$PATH(init$PATH)。我说得对吗?将coffee添加到$PATH的唯一方法是将其复制到/usr/local/bin吗?

否,shell将从Python解释器继承
路径,即它将是
os.getenv('PATH')
。此外,还可以在命令中设置路径:

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

尽管我真的建议您在执行Python程序之前使用
coffee
的完整路径,或者设置
path

否,shell将从Python解释器继承
路径,即它将是
os.getenv('path')
。此外,还可以在命令中设置路径:

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

尽管我真的建议您在执行Python程序之前使用
coffee
的完整路径,或者设置
路径。

历史上,对于作为非交互命令调用的shell,没有一个启动文件被读取,因为环境可能已经设置好了

Python、shell以及实际上几乎所有的东西都会将现有的环境或至少是
PATH
环境变量传递给子shell,因此,在某种程度上,您已经执行了
.profile
或bash扩展。(因为它是在用户登录和其他进程继承修改后的路径时运行的。)

您可以选择:

  • /etc/profile
  • 需要用户提供适当的路径设置(您继承了这些设置)
  • 使用完整路径名运行子流程实用程序
  • 将所有命令放在路径上已存在的目录中

历史上,对于作为非交互命令调用的shell,不会读取任何启动文件,因为环境可能已经设置好了

Python、shell以及实际上几乎所有的东西都会将现有的环境或至少是
PATH
环境变量传递给子shell,因此,在某种程度上,您已经执行了
.profile
或bash扩展。(因为它是在用户登录和其他进程继承修改后的路径时运行的。)

您可以选择:

  • /etc/profile
  • 需要用户提供适当的路径设置(您继承了这些设置)
  • 使用完整路径名运行子流程实用程序
  • 将所有命令放在路径上已存在的目录中

为命令设置环境变量的更好方法是将
env
参数设置为
subprocess.Popen
。即使你不涉及shell(毕竟,这通常是个坏主意。)@Thomas:是的,
env
会更好,也许OP一开始就不应该使用
shell=True
。谢谢,最后,我将coffee全局安装到/usr/local/bin,因为我不想在Python中硬编码路径。为命令设置环境变量的更好方法是将
env
参数设置为
subprocess.Popen
。即使你不使用shell(毕竟,这通常是个坏主意。)@Thomas:是的,
env
会更好,也许OP一开始就不应该使用
shell=True
。谢谢,我最后将coffee全局安装到/usr/local/bin,因为我不想在Python中硬编码路径。谢谢/upvoted。接受了拉斯曼的回答,因为他名声不太好:)谢谢/投了赞成票。接受拉斯曼的回答,因为他名声不太好:)