windows.md
1> **Источник:** https://python-all.ru/3.14/faq/windows.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [Python в Windows: часто задаваемые вопросы](https://python-all.ru/3.14/faq/windows.html#id1)89Содержание [FAQ по Python в Windows](https://python-all.ru/3.14/faq/windows.html#python-on-windows-faq) [Как запустить программу Python в Windows?](https://python-all.ru/3.14/faq/windows.html#how-do-i-run-a-python-program-under-windows) [Как сделать скрипты Python исполняемыми?](https://python-all.ru/3.14/faq/windows.html#how-do-i-make-python-scripts-executable) [Почему Python иногда так долго запускается?](https://python-all.ru/3.14/faq/windows.html#why-does-python-sometimes-take-so-long-to-start) [Как создать исполняемый файл из скрипта Python?](https://python-all.ru/3.14/faq/windows.html#how-do-i-make-an-executable-from-a-python-script) [Является ли файл `*.pyd` тем же, что и DLL?](https://python-all.ru/3.14/faq/windows.html#is-a-pyd-file-the-same-as-a-dll) [Как встроить Python в приложение Windows?](https://python-all.ru/3.14/faq/windows.html#how-can-i-embed-python-into-a-windows-application) [Как запретить редакторам вставлять табуляцию в исходный код Python?](https://python-all.ru/3.14/faq/windows.html#how-do-i-keep-editors-from-inserting-tabs-into-my-python-source) [Как проверить нажатие клавиши без блокировки?](https://python-all.ru/3.14/faq/windows.html#how-do-i-check-for-a-keypress-without-blocking) [Как исправить ошибку «отсутствует api-ms-win-crt-runtime-l1-1-0.dll»?](https://python-all.ru/3.14/faq/windows.html#how-do-i-solve-the-missing-api-ms-win-crt-runtime-l1-1-0-dll-error)1011## [Как запустить программу Python в Windows?](https://python-all.ru/3.14/faq/windows.html#id2)1213Это не обязательно простой вопрос. Если вы уже хорошо знакомы с запуском программ из командной строки Windows, всё будет очевидно; иначе может потребоваться больше пояснений.1415Если не используется интегрированная среда разработки, команды Windows придётся *вводить* в так называемое «окно командной строки». Обычно такое окно можно создать из строки поиска, найдя `cmd`. Признаком того, что окно открыто, служит приглашение командной строки Windows, которое обычно выглядит так:1617```doscon18C:\>19```2021Буква может быть другой, и после неё могут быть ещё символы, так что можно увидеть, например, такое:2223```doscon24D:\YourName\Projects\Python>25```2627в зависимости от настроек компьютера и от недавних действий на нём. Как только такое окно открыто, можно смело приступать к запуску программ Python.2829Нужно понимать, что ваши скрипты Python должны обрабатываться другой программой, называемой *интерпретатором* Python. Интерпретатор читает скрипт, компилирует его в байт-код, а затем выполняет байт-код для запуска программы. Итак, как сделать, чтобы интерпретатор обрабатывал ваш код Python?3031Во-первых, необходимо убедиться, что окно командной строки распознаёт слово «py» как инструкцию для запуска интерпретатора. Если окно командной строки уже открыто, следует попробовать ввести команду `py` и нажать ввод:3233```doscon34C:\Users\YourName> py35```3637После этого должно появиться примерно следующее:3839```pycon40Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win3241Type "help", "copyright", "credits" or "license" for more information.42>>>43```4445Интерпретатор запущен в «интерактивном режиме». Это означает, что можно вводить операторы или выражения Python в интерактивном режиме и сразу же получать их выполнение или вычисление. Это одна из самых сильных сторон Python. Проверьте это, введя несколько выражений на свой выбор и увидев результаты:4647```pycon48>>> print("Hello")49Hello50>>> "Hello" * 351'HelloHelloHello'52```5354Многие используют интерактивный режим как удобный и при этом очень гибкий калькулятор. Чтобы завершить интерактивный сеанс Python, следует вызвать функцию [`exit()`](https://python-all.ru/3.14/library/constants.html#exit) или удерживать клавишу `Ctrl` при вводе `Z`, а затем нажать клавишу «`Enter`», чтобы вернуться в командную строку Windows.5556Можно также обнаружить, что в меню «Пуск» есть пункты вроде Пуск ‣ Программы ‣ Python 3.x ‣ Python (командная строка), при выборе которых открывается новое окно с приглашением `>>>`. В этом случае окно закроется после вызова функции [`exit()`](https://python-all.ru/3.14/library/constants.html#exit) или ввода символов `Ctrl`-`Z`; Windows выполняет в этом окне одну команду «python» и закрывает его при завершении интерпретатора.5758Теперь, когда известно, что команда `py` распознаётся, можно передать ей скрипт Python. Нужно указать абсолютный или относительный путь к скрипту Python. Допустим, ваш скрипт Python находится на рабочем столе и называется `hello.py`, а командная строка открыта в домашнем каталоге, так что вы видите нечто похожее на:5960```text61C:\Users\YourName>62```6364Итак, теперь нужно дать команду `py` передать скрипт Python, набрав `py` и путь к скрипту:6566```text67C:\Users\YourName> py Desktop\hello.py68hello69```7071## [Как сделать скрипты Python исполняемыми?](https://python-all.ru/3.14/faq/windows.html#id3)7273В Windows стандартный установщик Python уже связывает расширение .py с типом файла (Python.File) и назначает этому типу команду открытия, запускающую интерпретатор (`D:\Program Files\Python\python.exe "%1" %*`). Этого достаточно, чтобы скрипты можно было запускать из командной строки как «foo.py». Если же нужно запускать скрипт простым вводом «foo» без расширения, необходимо добавить .py в переменную окружения PATHEXT.7475## [Почему Python иногда так долго запускается?](https://python-all.ru/3.14/faq/windows.html#id4)7677Обычно Python запускается в Windows очень быстро, но иногда поступают сообщения об ошибках, что Python внезапно начинает долго запускаться. Это кажется ещё более странным, потому что на других системах Windows с, казалось бы, идентичной конфигурацией Python работает нормально.7879Проблема может быть вызвана неправильной настройкой антивирусного ПО на проблемной машине. Известно, что некоторые антивирусные сканеры увеличивают время запуска на два порядка, если они настроены на мониторинг всех операций чтения файловой системы. Проверьте настройки антивирусного ПО на ваших системах, чтобы убедиться, что они действительно настроены одинаково. McAfee, будучи настроенным на сканирование всех операций чтения файловой системы, особенно этим грешит.8081## [Как создать исполняемый файл из скрипта Python?](https://python-all.ru/3.14/faq/windows.html#id5)8283См. [Как создать автономный бинарный файл из скрипта Python?](https://python-all.ru/3.14/faq/programming.html#faq-create-standalone-binary) – там приведён список инструментов, которые можно использовать для создания исполняемых файлов.8485## [Файл `*.pyd` – это то же самое, что DLL?](https://python-all.ru/3.14/faq/windows.html#id6)8687Да, .pyd-файлы – это DLL, но есть несколько отличий. Если есть DLL с именем `foo.pyd`, она должна содержать функцию `PyInit_foo()`. Тогда можно написать в Python «import foo», и Python будет искать foo.pyd (а также foo.py, foo.pyc) и, если найдёт, попытается вызвать `PyInit_foo()` для инициализации. Не следует связывать .exe с foo.lib, иначе Windows потребует наличия этой DLL.8889Обратите внимание, что путь поиска для foo.pyd – это PYTHONPATH, а не тот путь, который Windows использует для поиска foo.dll. Кроме того, присутствие foo.pyd не обязательно для запуска программы, тогда как при связывании программы с DLL эта DLL требуется. Разумеется, foo.pyd необходим, если нужно написать `import foo`. В DLL связь объявляется в исходном коде с помощью `__declspec(dllexport)`. В .pyd связь определяется в списке доступных функций.9091## [Как встроить Python в приложение Windows?](https://python-all.ru/3.14/faq/windows.html#id7)9293Встраивание интерпретатора Python в приложение Windows можно резюмировать следующим образом:94951. **Не** встраивайте Python непосредственно в .exe-файл. В Windows Python должен быть DLL, чтобы обрабатывать импорт модулей, которые сами являются DLL. (Это первый ключевой недокументированный факт.) Вместо этого следует связаться с `pythonNN.dll`; обычно он устанавливается в `C:\Windows\System`. *NN* – это версия Python, число например «33» для Python 3.3.9697 Связаться с Python можно двумя способами. Компоновка во время загрузки означает связывание с `pythonNN.lib`, а компоновка во время выполнения – связывание с `pythonNN.dll`. (Общее замечание: `pythonNN.lib` – это так называемая «библиотека импорта», соответствующая `pythonNN.dll`. Она лишь определяет символы для компоновщика.)9899 Компоновка во время выполнения значительно упрощает параметры связывания; всё происходит во время выполнения. Код должен загружать `pythonNN.dll` с помощью процедуры Windows `LoadLibraryEx()`. Также код должен использовать процедуры доступа и данные в `pythonNN.dll` (то есть C API Python), используя указатели, полученные с помощью процедуры Windows `GetProcAddress()`. Макросы позволяют скрыть использование этих указателей для любого C-кода, который вызывает процедуры C API Python.1002. If you use SWIG, it is easy to create a Python “extension module” that will make the app’s data and methods available to Python. SWIG will handle just about all the grungy details for you. The result is C code that you link *into* your .exe file (!) You do **not** have to create a DLL file, and this also simplifies linking.1013. SWIG создаст функцию инициализации (функцию на C), имя которой зависит от имени модуля расширения. Например, если модуль называется leo, функция инициализации будет называться initleo(). Если вы используете классы-тени SWIG (а это стоит делать), функция инициализации будет называться initleoc(). Она инициализирует в основном скрытый вспомогательный класс, используемый классом-тенью.102103 Причина, по которой можно скомпоновать код на C из шага 2 прямо в .exe-файл, в том, что вызов функции инициализации эквивалентен импорту модуля в Python! (Это второй ключевой недокументированный факт.)1044. Кратко: следующий код позволяет инициализировать интерпретатор Python вместе с вашим модулем расширения.105106 ```c107 #include <Python.h>108 ...109 Py_Initialize(); // Инициализировать Python.110 initmyAppc(); // Инициализировать (импортировать) вспомогательный класс.111 PyRun_SimpleString("import myApp"); // Импортировать теневой класс.112 ```1135. Есть две проблемы с C API Python, которые проявятся, если вы используете компилятор, отличный от MSVC (компилятор, которым собрана pythonNN.dll).114115 Problem 1: The so-called “Very High Level” functions that take `FILE *` arguments will not work in a multi-compiler environment because each compiler’s notion of a `struct FILE` will be different. From an implementation standpoint these are very low level functions.116117 Проблема 2: SWIG генерирует следующий код при создании обёрток для функций, возвращающих void:118119 ```c120 Py_INCREF(Py_None);121 _resultobj = Py_None;122 return _resultobj;123 ```124125 Увы, Py\_None – это макрос, который разворачивается в ссылку на сложную структуру данных \_Py\_NoneStruct внутри pythonNN.dll. И этот код тоже не будет работать в среде с несколькими компиляторами. Замените такой код на:126127 ```c128 return Py_BuildValue("");129 ```130131 It may be possible to use SWIG’s `%typemap` command to make the change automatically, though I have not been able to get this to work (I’m a complete SWIG newbie).1326. Использовать скрипт оболочки Python для вызова окна интерпретатора из вашего Windows-приложения – плохая идея: полученное окно будет независимо от оконной системы приложения. Вместо этого вам (или классу wxPythonWindow) следует создать «родное» окно интерпретатора. Подключить это окно к интерпретатору Python несложно. Вы можете перенаправить ввод-вывод Python на \_любой\_ объект, поддерживающий чтение и запись, так что всё, что нужно – это объект Python (определённый в вашем модуле расширения) с методами read() и write().133134## [How do I keep editors from inserting tabs into my Python source?](https://python-all.ru/3.14/faq/windows.html#id8)135136The FAQ does not recommend using tabs, and the Python style guide, [**PEP 8**](https://python-all.ru/3.14/faq/windows.html), recommends 4 spaces for distributed Python code; this is also the Emacs python-mode default.137138Under any editor, mixing tabs and spaces is a bad idea. MSVC is no different in this respect, and is easily configured to use spaces: Take Tools ‣ Options ‣ Tabs, and for file type “Default” set “Tab size” and “Indent size” to 4, and select the “Insert spaces” radio button.139140Python raises [`IndentationError`](https://python-all.ru/3.14/library/exceptions.html#IndentationError) or [`TabError`](https://python-all.ru/3.14/library/exceptions.html#TabError) if mixed tabs and spaces are causing problems in leading whitespace. You may also run the [`tabnanny`](https://python-all.ru/3.14/library/tabnanny.html#module-tabnanny) module to check a directory tree in batch mode.141142## [How do I check for a keypress without blocking?](https://python-all.ru/3.14/faq/windows.html#id9)143144Use the [`msvcrt`](https://python-all.ru/3.14/library/msvcrt.html#module-msvcrt) module. This is a standard Windows-specific extension module. It defines a function `kbhit()` which checks whether a keyboard hit is present, and `getch()` which gets one character without echoing it.145146## [How do I solve the missing api-ms-win-crt-runtime-l1-1-0.dll error?](https://python-all.ru/3.14/faq/windows.html#id10)147148This can occur on Python 3.5 and later when using Windows 8.1 or earlier without all updates having been installed. First ensure your operating system is supported and is up to date, and if that does not resolve the issue, visit the [Microsoft support page](https://python-all.ru/3.14/faq/windows.html) for guidance on manually installing the C Runtime update.149