首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OSError:[Errno 8]执行格式错误

OSError:[Errno 8]执行格式错误
EN

Stack Overflow用户
提问于 2014-12-23 00:34:18
回答 5查看 119.1K关注 0票数 52

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

"=“前后的空格是必填的。

代码语言:javascript
复制
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

EN

回答 5

Stack Overflow用户

发布于 2014-12-23 02:26:35

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

代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
>>> with open('a','w') as f: f.write('#!/bin/sh\nexit 0')
... 
>>> os.execl('./a', './a')

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

在POSIX系统上,外壳程序解析命令行,例如,如果script是:

代码语言:javascript
复制
#!/usr/bin/env python
import sys
print(sys.argv)

然后在shell中运行它:

代码语言:javascript
复制
$ /usr/local/bin/script hostname = '<hostname>' -p LONGLIST

产生:

代码语言:javascript
复制
['/usr/local/bin/script', 'hostname', '=', '<hostname>', '-p', 'LONGLIST']

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

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

代码语言:javascript
复制
from subprocess import check_call

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

注意:没有shell=True。而且您不需要转义<>,因为没有运行任何外壳程序。

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

代码语言:javascript
复制
$ file /usr/local/bin/script

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

代码语言:javascript
复制
$ uname -m
票数 115
EN

Stack Overflow用户

发布于 2017-11-16 20:14:19

我将劫持此线程,以指出当Popen的目标不可执行时,也可能发生此错误。当我意外地用zip文件覆盖了一个完全可执行的二进制文件时,我很难学到这一点。

票数 9
EN

Stack Overflow用户

发布于 2014-12-23 01:00:16

你试过这个吗?

代码语言:javascript
复制
Out = subprocess.Popen('/usr/local/bin/script hostname = actual_server_name -p LONGLIST'.split(), shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 

根据来自@J.F.Sebastian的apt注释进行编辑

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27606653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档