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

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

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

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

我认为其翻译为:

/bin/sh -c "coffee"

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

答案1

您可以PATH在启动 shell 之前修改 Python 脚本中的环境变量,即以下某些变体:

import os

os.environ['PATH'] = '/some/new/path:%s' % os.environ['PATH']
subpocess.Popen(['coffee'], shell=True)

请注意,设置shell=True通常是不必要的,您应该意识到这样做的后果,特别是当您Popen使用用户提供的数据进行调用时。一般问题是包含 shell 元字符(例如“>”或“;”、“&”)等的数据可能会导致意外行为。

更新:例如,如果我有一个名为的脚本/tmp/foo,并且我想使用来运行它subprocess.Popen,那么这样做就可以了:

>>> import os, subprocess
>>> os.environ['PATH'] = '/tmp:%s' % os.environ['PATH']
>>> subprocess.Popen('foo', shell=False)

如果我没有设置PATH,那么我得到预期的错误:

OSError: [Errno 2] No such file or directory

相关内容