Ответ 1
Я решил это, поместив эту строку в верхнюю часть вызываемой оболочки script:
#!/bin/sh
Это гарантирует, что система всегда будет использовать правильный интерпретатор при запуске script.
Вчера я написал и запустил 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 .....
Я решил это, поместив эту строку в верхнюю часть вызываемой оболочки script:
#!/bin/sh
Это гарантирует, что система всегда будет использовать правильный интерпретатор при запуске script.
Следующее выражение сработало для меня
subprocess.Popen(['sh','my_script.sh'])
Как сказал @tripleee, существует проблема с вашим script. Убедитесь, что:
Смотрите также: Почему "#!/usr/bin/env python" предположительно более корректен, чем просто "#!/usr/bin/python" ?
Сообщение об ошибке предполагает, что внешняя программа не является допустимым исполняемым файлом.
Это также может произойти, если бинарный файл не предназначен для работы в вашей системе.
Я использую 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
Ошибка в том, что исполняемые файлы не заданы в заданном формате для подпроцесса, чтобы выполнить его.
пример:
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()
Рекомендуется установить пакет binfmt-support, чтобы помочь системе лучше распознать скрипты. Это помогает независимо от того, есть ли у них линия shebang.