/bin/sh-Python的非交互式用法
我从Python中调用cmd,如下所示:/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解释器继承路径,即它将是
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。接受了拉斯曼的回答,因为他名声不太好:)谢谢/投了赞成票。接受拉斯曼的回答,因为他名声不太好:)