错误:[Errno 8]Exec form

2024-07-05 15:49:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难解析subprocess.Popen的参数。我正试图在我的Unix服务器上执行一个脚本。在shell提示符下运行时的脚本语法如下: /usr/local/bin/script hostname = <hostname> -p LONGLIST。无论我如何尝试,脚本都不会在subprocess.Popen中运行

“=”前后的空格是必需的。

import subprocess
Out = subprocess.Popen(['/usr/local/bin/script', 'hostname = ', 'actual server name', '-p', 'LONGLIST'],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

上述方法不起作用。

当我使用shell=False时,我得到OSError: [Errno 8] Exec format error


Tags: 服务器脚本参数binusrlocalunixscript
3条回答

我将劫持此线程,指出当Popen的目标不可执行时,也可能发生此错误。当我无意中用zip文件重写了一个完全可执行的二进制文件时,我很难理解这一点。

如果您认为“=”之前和之后的空格是必需的,请将其作为列表中的单独项目进行尝试。

Out = subprocess.Popen(['/usr/local/bin/script', 'hostname', '=', 'actual server name', '-p', 'LONGLIST'],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

如果shell脚本顶部没有shebang行,并且您正试图直接执行脚本,则可能会发生OSError: [Errno 8] Exec format error。下面是一个重现这一问题的例子:

>>> 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

要解决这个问题,只需添加shebang,例如,如果它是一个shell脚本;在脚本的顶部预处理#!/bin/sh

>>> with open('a','w') as f: f.write('#!/bin/sh\nexit 0')
... 
>>> os.execl('./a', './a')

它执行exit 0时没有任何错误。


在POSIX系统上,shell解析命令行,也就是说,如果script是:

#!/usr/bin/env python
import sys
print(sys.argv)

然后在shell中运行:

$ /usr/local/bin/script hostname = '<hostname>' -p LONGLIST

产生:

['/usr/local/bin/script', 'hostname', '=', '<hostname>', '-p', 'LONGLIST']

注意:'='周围没有空格。我在<hostname>周围添加了引号,以转义重定向元字符<>

要在Python中模拟shell命令,请运行:

from subprocess import check_call

cmd = ['/usr/local/bin/script', 'hostname', '=', '<hostname>', '-p', 'LONGLIST']
check_call(cmd)

注:无shell=True。而且不需要转义<>,因为没有运行shell。

"Exec format error"可能表示您的script格式无效,请运行:

$ file /usr/local/bin/script

找出它是什么。将架构与以下输出进行比较:

$ uname -m

相关问题 更多 >