Shebang не работает с python3
У меня есть следующая программа:
#!/usr/local/bin/python3
print("Hello")
Через терминал я делаю test.py
, и я получаю:
Traceback (most recent call last):
File "/usr/lib/python3.3/site.py", line 629, in <module>
main()
File "/usr/lib/python3.3/site.py", line 614, in main
known_paths = addusersitepackages(known_paths)
File "/usr/lib/python3.3/site.py", line 284, in addusersitepackages
user_site = getusersitepackages()
File "/usr/lib/python3.3/site.py", line 260, in getusersitepackages
user_base = getuserbase() # this will also set USER_BASE
File "/usr/lib/python3.3/site.py", line 250, in getuserbase
USER_BASE = get_config_var('userbase')
File "/usr/lib/python3.3/sysconfig.py", line 610, in get_config_var
return get_config_vars().get(name)
File "/usr/lib/python3.3/sysconfig.py", line 560, in get_config_vars
_init_posix(_CONFIG_VARS)
File "/usr/lib/python3.3/sysconfig.py", line 432, in _init_posix
from _sysconfigdata import build_time_vars
File "/usr/lib/python3.3/_sysconfigdata.py", line 6, in <module>
from _sysconfigdata_m import *
ImportError: No module named '_sysconfigdata_m'
Вместо этого, если я набираю python3 test.py
, он работает, я получаю:
Hello
P.S. which python3
---- > /usr/local/bin/python3
Ответы
Ответ 1
Как правило, позаботьтесь о некоторых подводных камнях:
- установите исполняемый флаг на script:
chmod u+x test.py
- попробуйте выполнить с предыдущей точкой "./", поэтому вызовите
./test.py
, иначе он может выполнить несколько других script из вашего PATH
- также убедитесь, что у вас нет оконных окон, это, по-видимому, также предотвращает оценку shebang. Есть несколько предложений, например, в этом ответе, о том, как преобразовать формат
-
#!/usr/bin/env python3
- лучший способ определить shebang, так как двоичный код python может быть установлен где-то в другом месте. env
проверит среду PATH
, чтобы найти двоичный файл
EDIT: Вышеупомянутая ошибка выглядит как окончание строк Windows. У меня тоже были они с разным выходом, хотя
Ответ 2
Вы можете видеть ImportError: No module named '_sysconfigdata_m'
, потому что /usr/lib/command-not-found
разбивается на вашу систему из-за ошибка ubuntu.
Чтобы обойти это, запустите ./test.py
, not test.py
- текущий каталог обычно не находится в $PATH
(из-за соображений безопасности), и поэтому вы должны указать путь явно, иначе команда не будет найдена, что может приводят к попытке запустить /usr/lib/command-not-found
, что приводит к ImportError
.
Если ./test.py
выходит с ошибкой с той же ошибкой, проверьте, нет ли '\r\v\f'
(неожиданных пробелов) в shebang (print(repr(open('test.py', 'rb').readline()))
). Если test.py
использует строки Windows, то попытка найти '/usr/local/bin/python3\r'
(уведомление: '\r'
из-за '\r\n'
newline) скорее всего не удастся, что может вызвать ошибку.