subprocess.Popen():OSError:[Errno 8] python中的exec格式错误?

时间:2014-11-07 18:42:22

标签: python linux shell

昨天,我编写并运行了一个python script,它使用shell执行subprocess.Popen(command.split()),其中命令是字符串,构成.sh脚本及其参数。这个脚本工作正常,直到昨天。今天,我运行了相同的脚本,现在我不断遇到这个错误。

p=subprocess.Popen(shell_command.split())
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 8] Exec format error

我知道在提出这个问题之前有过类似的问题,但在我的情况下,我尝试了一切不能解决我目的的问题。使用shell=True不起作用,因为我的shell脚本调用另一个shell脚本,在此脚本之前必须设置一些环境才能运行该脚本。我严重陷入困境。我只是重启我的系统一次。我正在使用ubuntu 12.04

修改

 import subprocess
 import os
 import sys

 arg1=sys.argv[1]
 arg2=sys.argve[2]

 shell_command = 'my_path/my_shell.sh ' + arg1 + ' '+ arg2
 P = subprocess.Popen(shell_command.split())
 P.wait()

my_shell.sh:

  arg1=$1
  arg2=$2

  cd $TOP
  setup the environment and run shell script
  build the kernel ...
  execute shell command .....

7 个答案:

答案 0 :(得分:70)

我通过将此行放在被调用的shell脚本的顶部来解决这个问题:

#!/bin/sh

这将保证系统在运行脚本时始终使用正确的解释器。

答案 1 :(得分:17)

以下声明为我工作

subprocess.Popen(['sh','my_script.sh'])

答案 2 :(得分:4)

正如@tripleee所说,执行脚本时出现问题。确保:

  • 将shell命令更改为" ./ my_path / my_script.sh"或" / bin / bash my_path / my_script.sh"。如有必要,请考虑环境变量。
  • 两个脚本都有执行位设置(chmod + x)
  • 文件存在于您认为他们所在的位置。 (使用abspath或验证环境)
  • 文件包含内容
  • 尝试删除并重新输入第一行。我建议杀死整行,并多次击退退格,以防##
  • 之前出现不可打印的字符!

另请参阅:Why is '#!/usr/bin/env python' supposedly more correct than just '#!/usr/bin/python'?

答案 3 :(得分:2)

错误消息表明外部程序不是有效的可执行文件。

答案 4 :(得分:2)

如果二进制文件无意在您的系统上运行,也会发生这种情况。

我在OSX上,但我运行的二进制文件并不适用于OSX,正如我在使用file path/to/binary时看到的那样:

webui/bin/wkhtmltopdf: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.18, BuildID[sha1]=b6566a9e44c43a0eebf18d8c1dc6cb616801a77e, stripped

答案 5 :(得分:1)

该错误是因为未按规定的格式提供可执行文件,以供子进程执行。

示例:

shell_command1 = r“ /路径/到/可执行文件/ shell /文件”

shell_command2 = r“。/path / to / executable / shell / file”

subprocess.call(shell_command1)或subprocess.Popen(shell_command1)将无法运行shell_command1,因为子进程需要可执行命令(如mailx,ls,ping等)或诸如shell_command2之类的可执行脚本,或者您需要指定这样的命令

subprocess.call([“ sh”,shell_command1]) subprocess.Popen([“ sh”,shell_command1])

但是,您也可以使用os.system()或os.Popen()

答案 6 :(得分:-1)

建议安装 binfmt-support 软件包,以帮助系统更好地识别这些内容。无论他们是否有一个shebang线,它都会有所帮助。