windows.md
1> **Источник:** https://python-all.ru/2.7/faq/windows.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [Python в Windows: часто задаваемые вопросы](https://python-all.ru/2.7/faq/windows.html#id1)89Содержание1011- [FAQ по Python в Windows](https://python-all.ru/2.7/faq/windows.html#python-on-windows-faq)1213 - [Как запустить программу Python в Windows?](https://python-all.ru/2.7/faq/windows.html#how-do-i-run-a-python-program-under-windows)14 - [Как сделать скрипты Python исполняемыми?](https://python-all.ru/2.7/faq/windows.html#how-do-i-make-python-scripts-executable)15 - [Почему Python иногда так долго запускается?](https://python-all.ru/2.7/faq/windows.html#why-does-python-sometimes-take-so-long-to-start)16 - [Как создать исполняемый файл из скрипта Python?](https://python-all.ru/2.7/faq/windows.html#how-do-i-make-an-executable-from-a-python-script)17 - [Является ли файл `*.pyd` тем же, что и DLL?](https://python-all.ru/2.7/faq/windows.html#is-a-pyd-file-the-same-as-a-dll)18 - [Как встроить Python в приложение Windows?](https://python-all.ru/2.7/faq/windows.html#how-can-i-embed-python-into-a-windows-application)19 - [Как запретить редакторам вставлять табуляцию в исходный код Python?](https://python-all.ru/2.7/faq/windows.html#how-do-i-keep-editors-from-inserting-tabs-into-my-python-source)20 - [Как проверить нажатие клавиши без блокировки?](https://python-all.ru/2.7/faq/windows.html#how-do-i-check-for-a-keypress-without-blocking)21 - [Как эмулировать os.kill() в Windows?](https://python-all.ru/2.7/faq/windows.html#how-do-i-emulate-os-kill-in-windows)22 - [Как извлечь загруженную документацию в Windows?](https://python-all.ru/2.7/faq/windows.html#how-do-i-extract-the-downloaded-documentation-on-windows)2324## [Как запустить программу Python в Windows?](https://python-all.ru/2.7/faq/windows.html#id2)2526Это не обязательно простой вопрос. Если вы уже хорошо знакомы с запуском программ из командной строки Windows, всё будет очевидно; иначе может потребоваться больше пояснений.2728Если вы не используете интегрированную среду разработки, вам придётся *вводить* команды Windows в так называемое «окно DOS» или «окно командной строки». Обычно такое окно можно открыть через меню «Пуск»; в Windows 7 нужно выбрать Пуск ‣ Программы ‣ Стандартные ‣ Командная строка. Вы сможете определить, что окно открыто, по приглашению командной строки Windows, которое обычно выглядит так:2930```python31C:\>32```3334Буква может быть другой, и после неё могут быть ещё символы, так что можно увидеть, например, такое:3536```python37D:\YourName\Projects\Python>38```3940в зависимости от настроек компьютера и от недавних действий на нём. Как только такое окно открыто, можно смело приступать к запуску программ Python.4142Нужно понимать, что ваши скрипты Python должны обрабатываться другой программой, называемой *интерпретатором* Python. Интерпретатор читает скрипт, компилирует его в байт-код, а затем выполняет байт-код для запуска программы. Итак, как сделать, чтобы интерпретатор обрабатывал ваш код Python?4344Сначала необходимо убедиться, что окно командной строки распознаёт слово «python» как инструкцию для запуска интерпретатора. Если вы открыли окно командной строки, попробуйте ввести команду `python` и нажать клавишу Ввод.4546```python47C:\Users\YourName> python48```4950После этого должно появиться примерно следующее:5152```python53Python 2.7.3 (default, Apr 10 2012, 22.71:26) [MSC v.1500 32 bit (Intel)] on win3254Type "help", "copyright", "credits" or "license" for more information.55>>>56```5758Интерпретатор запущен в «интерактивном режиме». Это означает, что можно вводить операторы или выражения Python в интерактивном режиме и сразу же получать их выполнение или вычисление. Это одна из самых сильных сторон Python. Проверьте это, введя несколько выражений на свой выбор и увидев результаты:5960```python61>>> print "Hello"62Hello63>>> "Hello" * 364'HelloHelloHello'65```6667Многие используют интерактивный режим как удобный и высокопрограммируемый калькулятор. Чтобы завершить сеанс Python, удерживайте нажатой клавишу `Ctrl`, нажимая `Z`, затем нажмите клавишу «`Enter`», чтобы вернуться в командную строку Windows.6869You may also find that you have a Start-menu entry such as Start ‣ Programs ‣ Python 2.7 ‣ Python (command line) that results in you seeing the `>>>` prompt in a new window. If so, the window will disappear after you enter the `Ctrl-Z` character; Windows is running a single “python” command in the window, and closes it when you terminate the interpreter.7071Если команда `python` вместо отображения приглашения интерпретатора `>>>` выдаёт сообщение вроде:7273```python74'python' is not recognized as an internal or external command, operable program or batch file.75```7677или:7879```python80Bad command or filename81```8283тогда необходимо убедиться, что компьютер знает, где найти интерпретатор Python. Для этого нужно изменить переменную PATH – список каталогов, в которых Windows ищет программы.8485Следует настроить добавление каталога установки Python в PATH каждого командного окна при его запуске. Если вы установили Python недавно, то команда8687```python88dir C:\py*89```9091вероятно, покажет, куда он установлен; обычно это что-то вроде `C:\Python27`. В противном случае придётся искать по всему диску… используйте Инструменты ‣ Найти или нажмите кнопку Поиск и найдите «python.exe». Предположим, вы обнаружите, что Python установлен в каталог `C:\Python27` (по умолчанию на момент написания), тогда убедитесь, что ввод команды9293```python94c:\Python27\python95```9697запускает интерпретатор, как описано выше (и не забывайте, что для выхода потребуется ввести «`Ctrl-Z`» и «`Enter`»). После того как вы проверили каталог, можно добавить его в системный путь, чтобы упростить запуск Python простым выполнением команды `python`. Начиная с CPython 2.7 это можно сделать непосредственно в установщике.9899Дополнительную информацию о переменных среды можно найти на странице [Использование Python в Windows](https://python-all.ru/2.7/using/windows.html#setting-envvars).100101## [Как сделать скрипты Python исполняемыми?](https://python-all.ru/2.7/faq/windows.html#id3)102103В Windows стандартный установщик Python уже связывает расширение .py с типом файла (Python.File) и назначает этому типу команду открытия, запускающую интерпретатор (`D:\Program Files\Python\python.exe "%1" %*`). Этого достаточно, чтобы скрипты можно было запускать из командной строки как «foo.py». Если же нужно запускать скрипт простым вводом «foo» без расширения, необходимо добавить .py в переменную окружения PATHEXT.104105## [Почему Python иногда так долго запускается?](https://python-all.ru/2.7/faq/windows.html#id4)106107Обычно Python запускается в Windows очень быстро, но иногда поступают сообщения об ошибках, что Python внезапно начинает долго запускаться. Это кажется ещё более странным, потому что на других системах Windows с, казалось бы, идентичной конфигурацией Python работает нормально.108109Проблема может быть вызвана неправильной настройкой антивирусного ПО на проблемной машине. Известно, что некоторые антивирусные сканеры увеличивают время запуска на два порядка, если они настроены на мониторинг всех операций чтения файловой системы. Проверьте настройки антивирусного ПО на ваших системах, чтобы убедиться, что они действительно настроены одинаково. McAfee, будучи настроенным на сканирование всех операций чтения файловой системы, особенно этим грешит.110111## [Как создать исполняемый файл из скрипта Python?](https://python-all.ru/2.7/faq/windows.html#id5)112113См. [http://www.py2exe.org/](https://python-all.ru/2.7/faq/windows.html) – расширение distutils, позволяющее создавать консольные и графические исполняемые файлы из кода Python.114115## [Файл `*.pyd` – это то же самое, что DLL?](https://python-all.ru/2.7/faq/windows.html#id6)116117Да, .pyd-файлы – это DLL, но есть несколько отличий. Если есть DLL с именем `foo.pyd`, она должна содержать функцию `initfoo()`. Тогда можно написать в Python «import foo», и Python будет искать foo.pyd (а также foo.py, foo.pyc) и, если найдёт, попытается вызвать `initfoo()` для инициализации. Не следует связывать .exe с foo.lib, иначе Windows потребует наличия этой DLL.118119Обратите внимание, что путь поиска для foo.pyd – это PYTHONPATH, а не тот путь, который Windows использует для поиска foo.dll. Кроме того, присутствие foo.pyd не обязательно для запуска программы, тогда как при связывании программы с DLL эта DLL требуется. Разумеется, foo.pyd необходим, если нужно написать `import foo`. В DLL связь объявляется в исходном коде с помощью `__declspec(dllexport)`. В .pyd связь определяется в списке доступных функций.120121## [Как встроить Python в приложение Windows?](https://python-all.ru/2.7/faq/windows.html#id7)122123Встраивание интерпретатора Python в приложение Windows можно резюмировать следующим образом:1241251. Не встраивайте Python напрямую в ваш .exe-файл. В Windows Python должен быть DLL для обработки импорта модулей, которые сами являются DLL. (Это первый ключевой недокументированный факт.) Вместо этого используйте компоновку с `pythonNN.dll`; обычно он устанавливается в `C:\Windows\System`. *NN* – это номер версии Python, например «27» для Python 2.7.126127 Связаться с Python можно двумя способами. Компоновка во время загрузки означает связывание с `pythonNN.lib`, а компоновка во время выполнения – связывание с `pythonNN.dll`. (Общее замечание: `pythonNN.lib` – это так называемая «библиотека импорта», соответствующая `pythonNN.dll`. Она лишь определяет символы для компоновщика.)128129 Компоновка во время выполнения значительно упрощает параметры связывания; всё происходит во время выполнения. Код должен загружать `pythonNN.dll` с помощью процедуры Windows `LoadLibraryEx()`. Также код должен использовать процедуры доступа и данные в `pythonNN.dll` (то есть C API Python), используя указатели, полученные с помощью процедуры Windows `GetProcAddress()`. Макросы позволяют скрыть использование этих указателей для любого C-кода, который вызывает процедуры C API Python.130131 Примечание для Borland: сначала преобразуйте `pythonNN.lib` в формат OMF с помощью Coff2Omf.exe.1322. Если вы используете SWIG, легко создать Python-«модуль расширения», который сделает данные и методы приложения доступными для Python. SWIG возьмет на себя практически все рутинные детали. В результате получается код на C, который вы встраиваете *в* свой .exe-файл (!) Вам не нужно создавать DLL-файл, и это также упрощает связывание.1333. SWIG создаст функцию инициализации (функцию на C), имя которой зависит от имени модуля расширения. Например, если модуль называется leo, функция инициализации будет называться initleo(). Если вы используете классы-тени SWIG (а это стоит делать), функция инициализации будет называться initleoc(). Она инициализирует в основном скрытый вспомогательный класс, используемый классом-тенью.134135 Причина, по которой можно скомпоновать код на C из шага 2 прямо в .exe-файл, в том, что вызов функции инициализации эквивалентен импорту модуля в Python! (Это второй ключевой недокументированный факт.)1364. Кратко: следующий код позволяет инициализировать интерпретатор Python вместе с вашим модулем расширения.137138 ```c139 #include "python.h"140 ...141 Py_Initialize(); // Инициализировать Python.142 initmyAppc(); // Инициализировать (импортировать) вспомогательный класс.143 PyRun_SimpleString("import myApp"); // Импортировать теневой класс.144 ```1455. Есть две проблемы с C API Python, которые проявятся, если вы используете компилятор, отличный от MSVC (компилятор, которым собрана pythonNN.dll).146147 Проблема 1: Так называемые «очень высокоуровневые» функции, принимающие аргументы FILE \*, не будут работать в среде с несколькими компиляторами, поскольку каждый компилятор имеет свое представление о struct FILE. С точки зрения реализации это очень \_низкоуровневые\_ функции.148149 Проблема 2: SWIG генерирует следующий код при создании обёрток для функций, возвращающих void:150151 ```c152 Py_INCREF(Py_None);153 _resultobj = Py_None;154 return _resultobj;155 ```156157 Увы, Py\_None – это макрос, который разворачивается в ссылку на сложную структуру данных \_Py\_NoneStruct внутри pythonNN.dll. И этот код тоже не будет работать в среде с несколькими компиляторами. Замените такой код на:158159 ```c160 return Py_BuildValue("");161 ```162163 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).1646. Использовать скрипт оболочки Python для вызова окна интерпретатора из вашего Windows-приложения – плохая идея: полученное окно будет независимо от оконной системы приложения. Вместо этого вам (или классу wxPythonWindow) следует создать «родное» окно интерпретатора. Подключить это окно к интерпретатору Python несложно. Вы можете перенаправить ввод-вывод Python на \_любой\_ объект, поддерживающий чтение и запись, так что всё, что нужно – это объект Python (определённый в вашем модуле расширения) с методами read() и write().165166## [How do I keep editors from inserting tabs into my Python source?](https://python-all.ru/2.7/faq/windows.html#id8)167168The FAQ does not recommend using tabs, and the Python style guide, [**PEP 8**](https://python-all.ru/2.7/faq/windows.html), recommends 4 spaces for distributed Python code; this is also the Emacs python-mode default.169170Under 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.171172Если есть подозрение, что проблемы с начальными пробелами вызваны смешением табуляции и пробелов, запустите Python с ключом [`-t`](https://python-all.ru/2.7/using/cmdline.html#cmdoption-t) или выполните модуль [`tabnanny`](https://python-all.ru/2.7/library/tabnanny.html#module-tabnanny) для проверки дерева каталогов в пакетном режиме.173174## [How do I check for a keypress without blocking?](https://python-all.ru/2.7/faq/windows.html#id9)175176Используйте модуль msvcrt. Это стандартный модуль расширения для Windows. Он определяет функцию `kbhit()`, которая проверяет наличие нажатия клавиши, и `getch()`, которая получает один символ без его отображения.177178## [Как эмулировать os.kill() в Windows?](https://python-all.ru/2.7/faq/windows.html#id10)179180До Python 2.7 и 3.2 для завершения процесса можно использовать [`ctypes`](https://python-all.ru/2.7/library/ctypes.html#module-ctypes):181182```python183import ctypes184185def kill(pid):186 """функция kill для Win32"""187 kernel32 = ctypes.windll.kernel32188 handle = kernel32.OpenProcess(1, 0, pid)189 return (0 != kernel32.TerminateProcess(handle, 0))190```191192В версиях 2.7 и 3.2 [`os.kill()`](https://python-all.ru/2.7/library/os.html#os.kill) реализована аналогично приведённой выше функции, с дополнительной возможностью отправки `Ctrl+C` и `Ctrl+Break` консольным подпроцессам, которые умеют обрабатывать эти сигналы. Подробнее см. [`os.kill()`](https://python-all.ru/2.7/library/os.html#os.kill).193194## [Как извлечь загруженную документацию в Windows?](https://python-all.ru/2.7/faq/windows.html#id11)195196Иногда при загрузке пакета документации в Windows через браузер расширение сохранённого файла оказывается .EXE. Это ошибка; расширение должно быть .TGZ.197198Просто переименуйте загруженный файл, чтобы у него было расширение .TGZ, и WinZip сможет его обработать. (Если ваша версия WinZip не справляется, скачайте новую с [https://www.winzip.com](https://python-all.ru/2.7/faq/windows.html).)199