what shebang to use for python scripts run under a pyenv virtualenv

前端 未结 5 1728
攒了一身酷
攒了一身酷 2020-12-08 18:34

When a python script is supposed to be run from a pyenv virtualenv what is the correct shebang for the file?

As an example test case, the d

相关标签:
5条回答
  • 2020-12-08 18:39

    If you need to use more shell than you can put in the #! shebang line, you can start the file with a simple shell script which launches Python on the same file.

    #!/bin/bash
    "exec" "pyenv" "exec" "python" "$0" "$@"
    # the rest of your Python script can be written below
    

    Because of the quoting, Python doesn't execute the first line, and instead joins the strings together for the module docstring... which effectively ignores it.

    You can see more here.

    0 讨论(0)
  • 2020-12-08 18:45

    It's not exactly answering the Q, but this suggestion by ephiement I think is a much better way to do what you want. I've elaborated a bit and added some more of an explanation as to how this works and how you can dynamically select the python to use:

    #!/bin/sh
    #
    # Choose the python we need. Explanation:
    # a) '''\' translates to \ in shell, and starts a python multi-line string
    # b) "" strings are treated as string concat by python, shell ignores them
    # c) "true" command ignores its arguments
    # c) exit before the ending ''' so the shell reads no further
    # d) reset set docstrings to ignore the multiline comment code
    #
    "true" '''\'
    PREFERRED_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python
    ALTERNATIVE_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
    FALLBACK_PYTHON=python3
    
    if [ -x $PREFERRED_PYTHON ]; then
        echo Using preferred python $ALTERNATIVE_PYTHON
        exec $PREFERRED_PYTHON "$0" "$@"
    elif [ -x $ALTERNATIVE_PYTHON ]; then
        echo Using alternative python $ALTERNATIVE_PYTHON
        exec $ALTERNATIVE_PYTHON "$0" "$@"
    else
        echo Using fallback python $FALLBACK_PYTHON
        exec python3 "$0" "$@"
    fi
    exit 127
    '''
    
    __doc__ = """What this file does"""
    print(__doc__)
    import platform
    print(platform.python_version())
    
    0 讨论(0)
  • 2020-12-08 18:48

    I don't really know why calling the interpreter with the full path wouldn't work for you, I use it all the time, but if you want to use the python interpreter that is in your environment you should do:

    #!/usr/bin/env python
    

    That way you search your environment for the python interpreter to use.

    0 讨论(0)
  • 2020-12-08 19:01

    maybe you need to check the file privileges:

    sudo chmod +x script.py
    
    0 讨论(0)
  • 2020-12-08 19:02

    As you expected, you should be able to use the full path to the virtual environment's python in the shebang to choose/control the environment the script runs in regardless of the environment of the controlling script.

    In the comments on your question, VPfB & you find that the /Users/username/.pyenv/shims/python is a shell script that does an exec $pyenv_python. You should be able to echo $pyenv_python to determine the real python and use that as your shebang.

    See also: https://unix.stackexchange.com/questions/209646/how-to-activate-virtualenv-when-a-python-script-starts

    Try pyenv virtualenvs to find a list of virtual environment directories.

    And then you might find a using shebang something like this:

    #!/Users/username/.pyenv/python/versions/venv_name/bin/python
    import pandas as pd
    print 'success'
    

    ... will enable the script to work using the chosen virtual environment in other (virtual or not) environments:

    (venv_name) $ ./script.py 
    success
    (venv_name) $ pyenv activate non_pandas_venv 
    (non_pandas_venv) $ ./script.py
    success
    (non_pandas_venv) $ . deactivate
    $ ./script.py
    success
    $
    

    The trick is that if you call out the virtual environment's python binary specifically, python looks around that binary's path location for the supporting files and ends up using the surrounding virtual environment. (See per How does virtualenv work? )

    0 讨论(0)
提交回复
热议问题