python - 操作系统错误 : [Errno 8] Exec format error

标签 python subprocess

我很难解析 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

最佳答案

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

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

关于python - 操作系统错误 : [Errno 8] Exec format error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27606653/

相关文章:

python - 从矩阵创建随机数组

python - 类型错误 : apply() missing 1 required positional argument: 'func'

Python 十六进制地址从字符串打包

python - 如何找到多个子流程的执行时间?

python - 子进程通信 : order matters?

python - Numpy:如何为多维数组的各个元素赋值?

python - Django的注释框架和CSRF

python - python父进程和python子进程的通信

python - 如何从 Windows 命令提示符运行 Openscad

python - 尝试使用 python 中的子进程模块打开 VSCode