subprocess.Popen引发子异常

时间:2017-08-03 06:46:53

标签: python subprocess

我在我的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

如何防止此错误?

2 个答案:

答案 0 :(得分:0)

Popen使用默认的无环境,因此不使用PATH。有几种解决方案:

  • 在Popen subprocess.Popen(args=['notify-send', message], env={'PATH': os.getenv('PATH')}
  • 中使用env
  • 使用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。