2025, Nov 02 03:18
Почему ./test.py в Windows даёт ошибку ICU и как это исправить
Почему в Windows запуск ./test.py даёт ошибку ICU. Объясняем влияние шебанга, префикса ./ и ассоциации .py, как проверить интерпретатор и исправить проблему.
Запуск Python-скрипта напрямую как ./test.py в Windows 10 может неожиданно завершаться ошибкой ICU, тогда как тот же код корректно работает при python ./test.py. Если это кажется странным в встроенном терминале VS Code при свежей установке с python.org, причина не в самом коде, а в том, как Windows обрабатывает исполняемые файлы по сравнению с Linux‑подобными средами.
Как воспроизвести проблему
Возьмём минимальный скрипт, сохранённый как test.py, с Unix‑шебангом в первой строке.
#!/usr/bin/env python
print("Hello World")Запуск таким способом приводит к ошибке:
./test.pyА явный вызов интерпретатора выполняется без проблем:
python ./test.pyСообщение об ошибке выглядит так:
[0711/233305.303:ERROR:icu_util.cc(223)] Invalid file descriptor to ICU data received.Что на самом деле происходит
Здесь вмешиваются две Linux‑конвенции: префикс пути ./ и шебанг #!/usr/bin/env python. В этом контексте Windows не использует прямые слэши как разделители путей и не учитывает такой шебанг для поиска интерпретатора. При запуске ./test.py в Windows система не выполняет файл «через шебанг», а опирается на зарегистрированную ассоциацию для файлов .py. Если ассоциация отсутствует или указывает на неожиданный объект, вы можете получить описанную ошибку, связанную с ICU. Напротив, python ./test.py напрямую вызывает установленный вами интерпретатор Python и полностью обходит проблему с ассоциацией.
Чтобы проверить, какой именно интерпретатор запускает скрипт при разных способах вызова, временно выведите путь к исполняемому файлу:
import sys
print(sys.executable)Как исправить или избежать ошибки ICU
Самый надёжный способ избежать проблемы — вызывать Python явно, например python test.py. Удаление Unix‑шебанга из скрипта помогает не вводить себя в заблуждение в Windows. Если вы предпочитаете запускать скрипты по имени, не набирая предварительно python, убедитесь, что в Windows правильно настроена ассоциация для файлов .py.
Для начала попробуйте самый простой вариант: запустите скрипт по имени без префикса ./. В корректно настроенной оболочке Windows ввод test.py и нажатие Enter должны запустить файл через ассоциацию .py. Если это не работает или вызывает ошибку ICU, настройте или восстановите ассоциацию. Это можно сделать через интерфейс: Открыть с помощью → Выбрать другое приложение и назначить python для файлов .py. Либо воспользуйтесь следующими командами в повышенной (администраторской) командной строке (укажите свой путь к python.exe):
assoc .py=Python.File
ftype Python.File="C:\Path\To\python.exe" "%1" %*Если ассоциация всё ещё работает некорректно, переустановка Python обычно восстанавливает верную конфигурацию. После этого продолжайте запускать либо python test.py, либо просто test.py — без префикса ./.
Исправленный минимальный скрипт
В Windows шебанг из мира Unix не нужен. Сам скрипт может оставаться минимальным — вот чистый вариант.
greeting_text = "Hello World"
print(greeting_text)Почему это важно
Кроссплатформенные привычки легко переносятся в рабочие процессы на Windows и порой приводят к запутанным сбоям инструментов, которые выглядят как проблемы рантайма или библиотек. Сообщение icu_util.cc — это признак способа запуска скрипта, а не ошибки в коде Python. Осознание того, что Windows использует ассоциации файлов для .py, игнорирует Unix‑шебанги и не применяет ./ как префикс пути, позволяет избежать лишних затрат времени.
Выводы
В Windows не стоит полагаться на ./ или Unix‑шебанг для запуска Python‑скриптов. Предпочитайте python test.py или, при корректной ассоциации .py, просто test.py. Если при прямом запуске возникает ошибка ICU, восстановите ассоциацию .py через «Открыть с помощью» или командами assoc и ftype, либо переустановите Python. В случае сомнений выполните print(sys.executable), чтобы проверить, какой интерпретатор действительно используется.