为什么subprocess在这里抛出OSError?
我写了一个自己的模块,主要是处理一个文件字段,用在一个django网站上。在处理一些和mod_wsgi有关的事情时(通过更新到3.3解决了这个问题),我的代码终于可以运行了。在所有必要的导入之后,在定义任何类或函数之前,我会先检查一下sox这个工具是否可用,因为它是我模块某些功能必不可少的一个音频命令行工具:
sox = 'path/to/sox'
test=subprocess.Popen([sox,'-h'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
error=test.communicate()[1]
if error:
raise EnvironmentError((1,'Sox not installed properly'),)
这个检查运行得很好。现在我把ubuntu从8.04更新到了10.04,结果在调用subprocess.Popen的那一行代码时出错了,出现了以下错误信息:
File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child
raise child_exception
OSError: [Errno 8] Exec format error
我已经检查过sox的执行权限了,但我不知道该往哪里找解决办法。subprocess的执行权限会有限制吗?有没有什么提示可以帮助我理解发生了什么?
3 个回答
1
如果你在Linux系统上遇到“OSError: [Errno 8] Exec format error”这个错误,先检查一下你的内核和可执行文件是否是同一个平台的,也就是32位和64位要一致。你可以用 uname -a
和 file <可执行文件路径>
这两个命令来查看。这个方法对我来说有效(而且这页内容是搜索这个错误时第一个出现的结果)。
1
试着用和你的 Django WSGI 进程相同的用户来执行 sox 命令。
有可能这个程序对那个用户来说是不可执行的,或者在你从 8.04 升级到 10.04 的时候,丢失了一些允许某些类型程序被执行的设置。
1
Apala的提示解决了这个问题。如果再次出现同样的情况,记得尝试不同版本的sox。即使sox在命令行上运行正常,也可能在子进程中引发问题。