OSError: [Errno 8] Exec format error
może się zdarzyć, jeśli nie ma linii shebang na górze skryptu powłoki i staramy się wykonać skrypt bezpośrednio. Oto przykład, który odtwarza problem:
>>> 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
Aby to naprawić, wystarczy dodać shebang np. Jeśli jest to skrypt powłoki; poprzedzić #!/bin/sh
na górze skryptu:
>>> with open('a','w') as f: f.write('#!/bin/sh\nexit 0')
...
>>> os.execl('./a', './a')
Wykonuje exit 0
bez żadnych błędów.
W systemach POSIX, powłoka przetwarza czyli linia poleceń, skrypt nie będzie widać przestrzenie wokół =
przykład jeśli script
jest:
#!/usr/bin/env python
import sys
print(sys.argv)
następnie uruchomić go w powłoce:
$ /usr/local/bin/script hostname = '<hostname>' -p LONGLIST
produkuje:
['/usr/local/bin/script', 'hostname', '=', '<hostname>', '-p', 'LONGLIST']
Uwaga: bez spacji około '='
. Dodałem cytaty o numerze <hostname>
, aby uniknąć metaznaków przekierowania <>
.
emulować polecenie powłoki w Pythonie, uruchom:
from subprocess import check_call
cmd = ['/usr/local/bin/script', 'hostname', '=', '<hostname>', '-p', 'LONGLIST']
check_call(cmd)
Uwaga: nie shell=True
. I nie musisz uciec <>
, ponieważ nie jest uruchamiana żadna powłoka.
"Exec format error"
może wskazywać, że script
ma nieprawidłowy format, uruchom:
$ file /usr/local/bin/script
aby dowiedzieć się, co to jest.Porównaj architekturę z wyjściem:
$ uname -m
Wild guess: spróbuj ''hostname = nazwa rzeczywistego serwera'' zamiast'' hostname = ',' rzeczywista nazwa serwera'' – Kevin
Na podstawie tego, jak mówisz, że uruchomiłeś to po znaku zachęty, wygląda na to, że 'hostname' jest jeden argument i '=' to osobny argument, co jest dość dziwne. Czy na pewno są spacje wokół '='? –
hi Bryan, tak, musi być miejsce. Skrypt przyjmuje argument typu klucz = wartość. – user3477108