давайте представим, что ваш файл python называется tst.py и имеет следующее содержимое
#!python
import sys
print(sys.executable, sys.version)
, тогда вы всегда можете набрать
python tst.py
Первая строка совершенно неактуальна идаже не смотрел.
Однако, если вы выполните следующее (например, в Linux)
chmod +x tst.py
./tst.py
Затем просматривается первая строка, чтобы определить, какой интерпретатор будет использоваться (bash, perl,python, что-то еще?) и здесь, по крайней мере, для моей ОС (ubuntu) и моей оболочки (bash) требуется абсолютный путь для имени исполняемого файла (например, /bin/bash
, /bin/python
, /usr/bin/env
)
Если я вызываю ./tst.py на моем компьютере с Ubuntu, я получаю
bash: ./tst.py: python: bad interpreter: No such file or directory
Особый случай Windows при вводе tst.py или щелчке скрипта на python. Если вы работаете в Windows, строка просматривается, но даже если она неверна, будет использован интерпретатор Python по умолчанию. В Windows эта строка может быть использована для явного выбора, например, python2 или python3. Windows использует ассоциации типов файлов, чтобы определить, какой исполняемый файл для вызова какого суффикса. для файлов .py (установлен python 3.x) обычно это py.exe, который является исполняемым файлом, расположенным в системном пути, который просто вызывает интерпретатор python. в зависимости от установленных версий, строки shebang и переменных среды, которые могут указывать на virtualenv
Приложение: Первая строка интерпретируется оболочкой или в случае Windows py.exe.
ItКажется, bash требует абсолютных путей для команды, тогда как zsh также принимает относительные пути.
Так что только для zsh
#!python
работает отлично, тогда как bash требует абсолютных путей и, таким образом, трюк с envкоманда
#!/usr/bin/env python
Для сценариев, которые должны выполняться cronjob, лучше жестко закодировать путь исполняемого файла python, поскольку PATH довольно минималистичен для cronjobs, поэтому лучше всего иметь что-то вроде
#!/usr/bin/python3.5
или
#!/home/username/myvirtualenv/bin/python