복붙노트

[PYTHON] OSError : [Errno 8] Exec 형식 오류

PYTHON

OSError : [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. ==============================

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

    2."="앞뒤의 공백이 필수라고 생각되면 목록에서 별도의 항목으로 사용해보십시오.

    "="앞뒤의 공백이 필수라고 생각되면 목록에서 별도의 항목으로 사용해보십시오.

    Out = subprocess.Popen(['/usr/local/bin/script', 'hostname', '=', 'actual server name', '-p', 'LONGLIST'],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    
  3. ==============================

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

    4.나는 Popen의 타겟이 실행 가능하지 않을 때이 에러가 발생할 수도 있다는 것을 지적하기 위해이 스레드를 납치 할 것이다. 우연히 zip 파일로 완벽하게 실행 가능한 바이너리 파일을 오버라이드했을 때 힘든 방법을 배웠다.

    나는 Popen의 타겟이 실행 가능하지 않을 때이 에러가 발생할 수도 있다는 것을 지적하기 위해이 스레드를 납치 할 것이다. 우연히 zip 파일로 완벽하게 실행 가능한 바이너리 파일을 오버라이드했을 때 힘든 방법을 배웠다.

  5. from https://stackoverflow.com/questions/27606653/oserror-errno-8-exec-format-error by cc-by-sa and MIT license