[PYTHON] OSError : [Errno 8] Exec 형식 오류
PYTHONOSError : [Errno 8] Exec 형식 오류
하위 프로세스에 대한 인수를 구문 분석하는 데 어려움을 겪고 있습니다. 유닉스 서버에서 스크립트를 실행하려고합니다. 쉘 프롬프트에서 실행할 때의 스크립트 구문은 다음과 같습니다. / usr / local / bin / 스크립트 호스트 이름 = <호스트 이름> -p LONGLIST. 아무리 시도해도 스크립트는 하위 프로세스 내에서 실행되지 않습니다 .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 형식 오류
해결법
-
==============================
1.OSError : [Errno 8] 쉘 스크립트 맨 위에 세번 줄이없고 스크립트를 직접 실행하려고하면 Exec 형식 오류가 발생할 수 있습니다. 다음은이 문제를 재현 한 예입니다.
OSError : [Errno 8] 쉘 스크립트 맨 위에 세번 줄이없고 스크립트를 직접 실행하려고하면 Exec 형식 오류가 발생할 수 있습니다. 다음은이 문제를 재현 한 예입니다.
>>> 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
문제를 해결하려면 예를 들어 쉘 스크립트 인 경우 예를 들어 shebang을 추가하십시오. 스크립트의 맨 앞에 #! / bin / sh를 추가하십시오.
>>> with open('a','w') as f: f.write('#!/bin/sh\nexit 0') ... >>> os.execl('./a', './a')
오류없이 exit 0을 실행합니다.
POSIX 시스템에서 쉘은 명령 줄을 구문 분석합니다. 즉, 스크립트에 공백이 표시되지 않습니다 (예 : 스크립트가 다음과 같은 경우).
#!/usr/bin/env python import sys print(sys.argv)
다음 쉘에서 실행 :
$ /usr/local/bin/script hostname = '<hostname>' -p LONGLIST
생산 :
['/usr/local/bin/script', 'hostname', '=', '<hostname>', '-p', 'LONGLIST']
참고 : '='주변에 공백을 넣지 마십시오. 리디렉션 메타 문자 <>를 이스케이프하기 위해
을 따옴표로 추가했습니다. 파이썬에서 쉘 명령을 에뮬레이션하려면 다음을 실행하십시오.
from subprocess import check_call cmd = ['/usr/local/bin/script', 'hostname', '=', '<hostname>', '-p', 'LONGLIST'] check_call(cmd)
주 : no shell = True. 그리고 쉘이 실행되지 않으므로 <>를 이스케이프 할 필요가 없습니다.
"Exec format error"는 스크립트의 형식이 잘못되어 다음과 같이 표시 될 수 있음을 나타냅니다.
$ file /usr/local/bin/script
그것이 무엇인지 알아 내기 위해. 아키텍처를 다음과 같은 출력과 비교하십시오.
$ uname -m
-
==============================
2."="앞뒤의 공백이 필수라고 생각되면 목록에서 별도의 항목으로 사용해보십시오.
"="앞뒤의 공백이 필수라고 생각되면 목록에서 별도의 항목으로 사용해보십시오.
Out = subprocess.Popen(['/usr/local/bin/script', 'hostname', '=', 'actual server name', '-p', 'LONGLIST'],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
-
==============================
3.이거 해봤 니?
이거 해봤 니?
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의 적절한 의견에 따라 편집 됨
-
==============================
4.나는 Popen의 타겟이 실행 가능하지 않을 때이 에러가 발생할 수도 있다는 것을 지적하기 위해이 스레드를 납치 할 것이다. 우연히 zip 파일로 완벽하게 실행 가능한 바이너리 파일을 오버라이드했을 때 힘든 방법을 배웠다.
나는 Popen의 타겟이 실행 가능하지 않을 때이 에러가 발생할 수도 있다는 것을 지적하기 위해이 스레드를 납치 할 것이다. 우연히 zip 파일로 완벽하게 실행 가능한 바이너리 파일을 오버라이드했을 때 힘든 방법을 배웠다.
from https://stackoverflow.com/questions/27606653/oserror-errno-8-exec-format-error by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬, 열거 형은 무엇에 좋은가요? [복제] (0) | 2018.11.12 |
---|---|
[PYTHON] 판다에 ELIF로 열 만들기 (0) | 2018.11.12 |
[PYTHON] 줄 바꿈으로 구분 된 파일을 읽고 줄 바꿈을 삭제하는 가장 좋은 방법은 무엇입니까? (0) | 2018.11.12 |
[PYTHON] Matplotlib : "scatter / dot / beeswarm"플롯에서 중첩되는 데이터 포인트 피하기 (0) | 2018.11.12 |
[PYTHON] "파이썬에 사전 추가하기" [복제] (0) | 2018.11.12 |