Недавно я обнаружил аргумент -i
для Python, который переходит в интерактивный режим после завершения сценария. Довольно аккуратно!
$ cat test.py
#!python3 -i
x=5
print('The value of x is ' + str(x))
$ ./test.py
The value of x is 5
>>> print(str(x+1))
6
>>>
zsh: suspended ./test.py
Однако когда я попытался скопировать этот сценарий в версию, которая завершается по завершении, это не удалось:
$ cat test1.py
#!python3
x=5
print('The value of x is ' + str(x))
$ ./test.py
/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/Resources/Python.app/Contents/MacOS/Python: can't open file '
x=5
print('The value of x is ' + str(x))
': [Errno 2] No such file or directory
Из некоторого дальнейшего чтения я обнаружил, что изначально сделал ошибку, и #!/usr/bin/env python3
- правильный шебанг.
Однако мне любопытно, почему неабсолютный путь к python3
успешен только, когда я выставляю флаг -i
. Я предполагаю, что это должно быть как-то связано с тем, как zsh
интерпретирует неабсолютные шебанги, но я не знаю достаточно, чтобы знать, как это исследовать.
Настройка системы: MacOS 10.12.6, iTerm2 3.1.6, zsh 5.2. which python3
дает /usr/local/bin/python3
, и этот каталог находится на $PATH
.
Интересно, что у меня другое поведение на sh:
$ sh
sh-3.2$ cat test.py
#!python3
x=5
print('The value of x is ' + str(x))
sh-3.2$ ./test.py
sh: ./test.py: python3: bad interpreter: No such file or directory
Я получил несколько комментариев, предполагающих, что это как-то связано с CWD или разрешениями. python3
отсутствует в моем CWD, и оба файла имеют разрешение на выполнение:
$ ls -al | grep 'py' | awk '{print $1, $10}'
-rw------- .python_history
-rwxr-xr-x test.py
-rwxr-xr-x test1.py
$PATH
или аргументы командной строки не играют здесь роли. - person n. 1.8e9-where's-my-share m.   schedule 13.07.2018cd
в примерах выше. Я добавил фрагмент, демонстрирующий, что python3 отсутствует на моем cwd и что test1.py имеет разрешение на выполнение - person scubbo   schedule 13.07.2018