Должен ли я поставить #! (Шебанг) ​​в скриптах Python, и какую форму это должно принять?

Я не думаю, что FTP-клиент командной строки в окнах достаточно умен, чтобы выполнять интерполяцию переменных среды / оболочки в командах. Но вы можете заставить управляющий файл .bat генерировать сценарий ftp динамически и делать переменную, пока вы все еще на уровне оболочки.

681
задан Mike T 1 November 2017 в 01:20
поделиться

1 ответ

Если Вам установили различные модули и должны использовать определенную установку Python, то хижина, кажется, ограничена сначала. Однако можно сделать приемы как ниже, чтобы позволить хижине быть вызванной сначала как сценарий оболочки и затем выбрать Python. Это - очень гибкий imo:

#!/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 "[110]" "$@"
elif [ -x $ALTERNATIVE_PYTHON ]; then
    echo Using alternative python $ALTERNATIVE_PYTHON
    exec $ALTERNATIVE_PYTHON "[110]" "$@"
else
    echo Using fallback python $FALLBACK_PYTHON
    exec python3 "[110]" "$@"
fi
exit 127
'''

__doc__ = """What this file does"""
print(__doc__)
import platform
print(platform.python_version())

Или еще лучше, возможно, для упрощения повторного использования кода через несколько сценариев Python:

#!/bin/bash
"true" '''\'; source $(cd $(dirname ${BASH_SOURCE[@]}) &>/dev/null && pwd)/select.sh; exec $CHOSEN_PYTHON "[111]" "$@"; exit 127; '''

и затем select.sh имеет:

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
    CHOSEN_PYTHON=$PREFERRED_PYTHON
elif [ -x $ALTERNATIVE_PYTHON ]; then
    CHOSEN_PYTHON=$ALTERNATIVE_PYTHON
else
    CHOSEN_PYTHON=$FALLBACK_PYTHON
fi
1
ответ дан 22 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: