Subprocess.Popen(): OSError: [Errno 8] Ошибка формата Exec в python?

Вчера я написал и запустил python script, который выполняет shell с помощью subprocess.Popen(command.split()), где команда - это строка, которая составляет .sh script и ее аргумент. Этот script работал до вчерашнего дня. Сегодня я запускал тот же script, и теперь я постоянно ударяю эту ошибку.

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 не работает, потому что моя оболочка script вызывает другую оболочку script, перед которой необходимо установить некоторую среду для запуска этого script. Я сильно застрял в этом. Я просто перезагружаю систему один раз. Я использую ubuntu 12.04

EDIT:

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

Ответы

Ответ 1

Я решил это, поместив эту строку в верхнюю часть вызываемой оболочки script:

#!/bin/sh

Это гарантирует, что система всегда будет использовать правильный интерпретатор при запуске script.

Ответ 2

Следующее выражение сработало для меня

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

Ответ 3

Как сказал @tripleee, существует проблема с вашим script. Убедитесь, что:

  • Измените команду оболочки на "./my_path/my_script.sh" или "/bin/ bash my_path/my_script.sh". Учетные переменные среды, если необходимо.
  • Оба сценария имеют бит выполнения бит (chmod + x)
  • Файлы существуют в том месте, которое, по вашему мнению, они делают. (Используйте abspath или проверьте среду)
  • Файлы имеют содержимое
  • Попробуйте удалить и перепечатать первую строку. Я рекомендую убить всю строку и несколько раз ударять назад в случае отсутствия символа без печати перед #!

Смотрите также: Почему "#!/usr/bin/env python" предположительно более корректен, чем просто "#!/usr/bin/python" ?

Ответ 4

Сообщение об ошибке предполагает, что внешняя программа не является допустимым исполняемым файлом.

Ответ 5

Это также может произойти, если бинарный файл не предназначен для работы в вашей системе.

Я использую 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

Ответ 6

Ошибка в том, что исполняемые файлы не заданы в заданном формате для подпроцесса, чтобы выполнить его.

пример:

shell_command1 = r "/путь/к/исполняемому файлу/оболочке/файлу"

shell_command2 = r "./путь/к/исполняемому файлу/оболочке/файлу"

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

Ответ 7

Рекомендуется установить пакет binfmt-support, чтобы помочь системе лучше распознать скрипты. Это помогает независимо от того, есть ли у них линия shebang.