Python OSError:[Errno 8]Exec格式错误

Python OSError:[Errno 8]Exec格式错误,python,subprocess,Python,Subprocess,我很难解析subprocess.Popen的参数。我正在尝试在Unix服务器上执行脚本。在shell提示符下运行时的脚本语法如下: /usr/local/bin/script主机名=-p LONGLIST。无论我如何尝试,脚本都不会在subprocess.Popen内运行 “=”前后的空格是必填的 import subprocess Out = subprocess.Popen(['/usr/local/bin/script', 'hostname = ', 'actual server nam

我很难解析subprocess.Popen的参数。我正在尝试在Unix服务器上执行脚本。在shell提示符下运行时的脚本语法如下:
/usr/local/bin/script主机名=-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格式错误

您尝试过这个吗

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注释编辑如果您认为“=”前后的空格是必需的,请在列表中单独尝试

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

OSError:[Errno 8]Exec格式错误
如果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
它执行
退出0
,没有任何错误


在POSIX系统上,shell解析命令行,即您的脚本不会看到
=
周围的空格,例如,如果
script
是:

#!/usr/bin/env python
import sys
print(sys.argv)
然后在shell中运行它:

$ /usr/local/bin/script hostname = '<hostname>' -p LONGLIST
注意:否
shell=True
。您不需要转义
,因为没有运行shell

“Exec format error”
可能表示您的
脚本的格式无效,请运行:

$ file /usr/local/bin/script
找出它是什么。将架构与以下内容的输出进行比较:

$ uname -m

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

提到
Pexpect
确实会引发类似的错误,这一点是没错的

#python -c "import pexpect; p=pexpect.spawn('/usr/local/ssl/bin/openssl_1.1.0f  version'); p.interact()"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python2.7/site-packages/pexpect.py", line 430, in __init__
    self._spawn (command, args)
  File "/usr/lib/python2.7/site-packages/pexpect.py", line 560, in _spawn
    os.execv(self.command, self.args)
OSError: [Errno 8] Exec format error

胡乱猜测:试试
'hostname=actual server name'
而不是
'hostname=','actual server name'
根据您在提示符下运行它的方式,它看起来像
hostname
是一个参数,
=
是一个单独的参数,这很奇怪。你确定
=
周围有空格吗?嗨,布莱恩,是的,一定有空格。脚本接受key=value类型的参数。@user3477108-这令人费解,您说必须有一个空格,但给出了一个没有空格的“key=value”示例。当然,由于您的命令行示例有一个空格,我们知道
key=value
应该是
Popen
的3个参数,如insti所示。谢谢。我在我的原始脚本周围写了一个小包装脚本,以忽略“=”周围的空格。包装脚本运行良好。嗨,Rchang,谢谢你的反馈。它不起作用。我的脚本在“=”前后需要空格。您的解决方案提供了吗?这在这个命令上应该可以工作,但不是一个好的通用解决方案,因为它不允许您逃逸嵌入式空间。
shlex.split
方法可能是一个更好的选择。@J.F.Sebastian是的,你当然是对的-谢谢你的catch.downvoted。(在大多数情况下这是一个错误)。我一定是无意中删除了我在vim中的部分shebang。。。在你发帖之前我一直迷路。谢谢。@nbro:错了。请看我答案中的第一个代码示例。如果没有舍邦,你会出错的。这与中的错误相同。如果在shell中运行命令,则不会出现错误(在本例中,no-shebang表示“作为shell脚本运行”)
subprocess.check_output()
默认情况下不运行shell——除非您明确询问(如果您不知道,请询问以重新打开您的问题),否则任何子流程函数都不会运行shell。这样做对我有帮助:#/usr/bin/envpython@skygeek:这样的shebang只适用于Python脚本。缺少shebang行对我来说就是这样!这就是为什么我的答案建议
归档您的可执行文件
命令(它将显示您有一个zip存档)。尽管某些zip归档文件也可能是适当的可执行文件,例如。,
$ file /usr/local/bin/script
$ uname -m
#python -c "import pexpect; p=pexpect.spawn('/usr/local/ssl/bin/openssl_1.1.0f  version'); p.interact()"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python2.7/site-packages/pexpect.py", line 430, in __init__
    self._spawn (command, args)
  File "/usr/lib/python2.7/site-packages/pexpect.py", line 560, in _spawn
    os.execv(self.command, self.args)
OSError: [Errno 8] Exec format error
#python -c "import pexpect; p=pexpect.spawn('/bin/bash /usr/local/ssl/bin/openssl_1.1.0f  version'); p.interact()"
OpenSSL 1.1.0f  25 May 2017