Why do people write #!/usr/bin/env python on the first line of a Python script?

后端 未结 21 1759
刺人心
刺人心 2020-11-21 06:16

It seems to me like the files run the same without that line.

相关标签:
21条回答
  • 2020-11-21 07:06

    It's recommended way, proposed in documentation:

    2.2.2. Executable Python Scripts

    On BSD’ish Unix systems, Python scripts can be made directly executable, like shell scripts, by putting the line

    #! /usr/bin/env python3.2
    

    from http://docs.python.org/py3k/tutorial/interpreter.html#executable-python-scripts

    0 讨论(0)
  • 2020-11-21 07:07

    That is called the shebang line. As the Wikipedia entry explains:

    In computing, a shebang (also called a hashbang, hashpling, pound bang, or crunchbang) refers to the characters "#!" when they are the first two characters in an interpreter directive as the first line of a text file. In a Unix-like operating system, the program loader takes the presence of these two characters as an indication that the file is a script, and tries to execute that script using the interpreter specified by the rest of the first line in the file.

    See also the Unix FAQ entry.

    Even on Windows, where the shebang line does not determine the interpreter to be run, you can pass options to the interpreter by specifying them on the shebang line. I find it useful to keep a generic shebang line in one-off scripts (such as the ones I write when answering questions on SO), so I can quickly test them on both Windows and ArchLinux.

    The env utility allows you to invoke a command on the path:

    The first remaining argument specifies the program name to invoke; it is searched for according to the PATH environment variable. Any remaining arguments are passed as arguments to that program.

    0 讨论(0)
  • 2020-11-21 07:08

    If you're running your script in a virtual environment, say venv, then executing which python while working on venv will display the path to the Python interpreter:

    ~/Envs/venv/bin/python

    Note that the name of the virtual environment is embedded in the path to the Python interpreter. Therefore, hardcoding this path in your script will cause two problems:

    • If you upload the script to a repository, you're forcing other users to have the same virtual environment name. This is if they identify the problem first.
    • You won't be able to run the script across multiple virtual environments even if you had all required packages in other virtual environments.

    Therefore, to add to Jonathan's answer, the ideal shebang is #!/usr/bin/env python, not just for portability across OSes but for portability across virtual environments as well!

    0 讨论(0)
  • 2020-11-21 07:08

    It tells the interpreter which version of python to run the program with when you have multiple versions of python.

    0 讨论(0)
  • 2020-11-21 07:11

    This is a shell convention that tells the shell which program can execute the script.

    #!/usr/bin/env python

    resolves to a path to the Python binary.

    0 讨论(0)
  • 2020-11-21 07:11

    You can try this issue using virtualenv

    Here is test.py

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

    Create virtual environments

    virtualenv test2.6 -p /usr/bin/python2.6
    virtualenv test2.7 -p /usr/bin/python2.7
    

    activate each environment then check the differences

    echo $PATH
    ./test.py
    
    0 讨论(0)
提交回复
热议问题