我在我的python文件中添加了一个操作:
subprocess.Popen(['notify-send', message])
并且终端上的错误是:
subprocess.Popen(['notify-send', message])
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 710, in __init__ errread, errwrite)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1335, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
如何防止此错误?
答案 0 :(得分:0)
Popen使用默认的无环境,因此不使用PATH。有几种解决方案:
subprocess.Popen(args=['notify-send', message], env={'PATH': os.getenv('PATH')}
notify-send
subprocess.Popen(['/full/path/here/notify-send', message])
答案 1 :(得分:0)
按照设计,启动其他程序的程序默认不使用PATH环境变量。它曾经是一种常见的攻击方式,通过改变PATH或在正常PATH中安装比真实孩子更高优先级的流氓程序来破坏合法程序。因此,流氓程序可以代表用户执行而不会发生任何异常操作。
有很多方法可以强制使用PATH,它对于简单的操作来说很好(参数shell = TRUE
就是其中之一)。但是对于更严肃的脚本,它与使用C {或C ++语言中的system
而不是fork
+ exec
的皱眉相同。
TL / DR:最正确的方法是传递子程序的完整PATH。