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) скорее всего не удастся, что может вызвать ошибку.