<p>如果shell脚本顶部没有shebang行,并且您正试图直接执行脚本,则可能会发生<code>OSError: [Errno 8] Exec format error</code>。下面是一个重现这一问题的例子:</p>
<pre><code>>>> with open('a','w') as f: f.write('exit 0') # create the script
...
>>> import os
>>> os.chmod('a', 0b111101101) # rwxr-xr-x make it executable
>>> os.execl('./a', './a') # execute it
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/os.py", line 312, in execl
execv(file, args)
OSError: [Errno 8] Exec format error
</code></pre>
<p>要解决这个问题,只需添加shebang,例如,如果它是一个shell脚本;在脚本的顶部预处理<code>#!/bin/sh</code>:</p>
<pre><code>>>> with open('a','w') as f: f.write('#!/bin/sh\nexit 0')
...
>>> os.execl('./a', './a')
</code></pre>
<p>它执行<code>exit 0</code>时没有任何错误。</p>
<hr/>
<p>在POSIX系统上,shell解析命令行,也就是说,如果<code>script</code>是:</p>
<pre><code>#!/usr/bin/env python
import sys
print(sys.argv)
</code></pre>
<p>然后在shell中运行:</p>
<pre><code>$ /usr/local/bin/script hostname = '<hostname>' -p LONGLIST
</code></pre>
<p>产生:</p>
<pre><code>['/usr/local/bin/script', 'hostname', '=', '<hostname>', '-p', 'LONGLIST']
</code></pre>
<p>注意:<em>在<code>'='</code>周围没有空格。我在<code><hostname></code>周围添加了引号,以转义重定向元字符<code><></code>。</p>
<p>要在Python中模拟shell命令,请运行:</p>
<pre><code>from subprocess import check_call
cmd = ['/usr/local/bin/script', 'hostname', '=', '<hostname>', '-p', 'LONGLIST']
check_call(cmd)
</code></pre>
<p>注:无<code>shell=True</code>。而且不需要转义<code><></code>,因为没有运行shell。</p>
<p><code>"Exec format error"</code>可能表示您的<code>script</code>格式无效,请运行:</p>
<pre><code>$ file /usr/local/bin/script
</code></pre>
<p>找出它是什么。将架构与以下输出进行比较:</p>
<pre><code>$ uname -m
</code></pre>