OSError: [Errno 8] Exec format error

后端 未结 5 1089
孤街浪徒
孤街浪徒 2020-12-05 13:09

I am having hard time parsing the arguments to subprocess.Popen. I am trying to execute a script on my Unix server. The script syntax when running on shell prompt is as fol

5条回答
  •  伪装坚强ぢ
    2020-12-05 13:28

    OSError: [Errno 8] Exec format error can happen if there is no shebang line at the top of the shell script and you are trying to execute the script directly. Here's an example that reproduces the issue:

    >>> 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 "", line 1, in 
      File "/usr/lib/python2.7/os.py", line 312, in execl
        execv(file, args)
    OSError: [Errno 8] Exec format error
    

    To fix it, just add the shebang e.g., if it is a shell script; prepend #!/bin/sh at the top of your script:

    >>> with open('a','w') as f: f.write('#!/bin/sh\nexit 0')
    ... 
    >>> os.execl('./a', './a')
    

    It executes exit 0 without any errors.


    On POSIX systems, shell parses the command line i.e., your script won't see spaces around = e.g., if script is:

    #!/usr/bin/env python
    import sys
    print(sys.argv)
    

    then running it in the shell:

    $ /usr/local/bin/script hostname = '' -p LONGLIST
    

    produces:

    ['/usr/local/bin/script', 'hostname', '=', '', '-p', 'LONGLIST']
    

    Note: no spaces around '='. I've added quotes around to escape the redirection metacharacters <>.

    To emulate the shell command in Python, run:

    from subprocess import check_call
    
    cmd = ['/usr/local/bin/script', 'hostname', '=', '', '-p', 'LONGLIST']
    check_call(cmd)
    

    Note: no shell=True. And you don't need to escape <> because no shell is run.

    "Exec format error" might indicate that your script has invalid format, run:

    $ file /usr/local/bin/script
    

    to find out what it is. Compare the architecture with the output of:

    $ uname -m
    

提交回复
热议问题