我正在从 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