> **Источник:** https://python-all.ru/3.4/faq/windows.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# [Python в Windows: часто задаваемые вопросы](https://python-all.ru/3.4/faq/windows.html#id1)

Содержание

- [FAQ по Python в Windows](https://python-all.ru/3.4/faq/windows.html#python-on-windows-faq)

  - [Как запустить программу Python в Windows?](https://python-all.ru/3.4/faq/windows.html#how-do-i-run-a-python-program-under-windows)
  - [Как сделать скрипты Python исполняемыми?](https://python-all.ru/3.4/faq/windows.html#how-do-i-make-python-scripts-executable)
  - [Почему Python иногда так долго запускается?](https://python-all.ru/3.4/faq/windows.html#why-does-python-sometimes-take-so-long-to-start)
  - [Как создать исполняемый файл из скрипта Python?](https://python-all.ru/3.4/faq/windows.html#how-do-i-make-an-executable-from-a-python-script)
  - [Является ли файл `*.pyd` тем же самым, что и DLL?](https://python-all.ru/3.4/faq/windows.html#is-a-pyd-file-the-same-as-a-dll)
  - [Как встроить Python в приложение Windows?](https://python-all.ru/3.4/faq/windows.html#how-can-i-embed-python-into-a-windows-application)
  - [Как запретить редакторам вставлять табуляцию в исходный код Python?](https://python-all.ru/3.4/faq/windows.html#how-do-i-keep-editors-from-inserting-tabs-into-my-python-source)
  - [Как проверить нажатие клавиши без блокировки?](https://python-all.ru/3.4/faq/windows.html#how-do-i-check-for-a-keypress-without-blocking)
  - [Как эмулировать os.kill() в Windows?](https://python-all.ru/3.4/faq/windows.html#how-do-i-emulate-os-kill-in-windows)
  - [Как извлечь загруженную документацию в Windows?](https://python-all.ru/3.4/faq/windows.html#how-do-i-extract-the-downloaded-documentation-on-windows)

## [Как запустить программу Python в Windows?](https://python-all.ru/3.4/faq/windows.html#id2)

Это не обязательно простой вопрос. Если вы уже хорошо знакомы с запуском программ из командной строки Windows, всё будет очевидно; иначе может потребоваться больше пояснений.

[![Разработка Python на XP](https://python-all.ru/3.4/_images/python-video-icon.png)](https://python-all.ru/3.4/faq/windows.html)

[Разработка Python на XP](https://python-all.ru/3.4/faq/windows.html)

Эта серия скринкастов поможет начать работу с Python на Windows XP. Материал умещается в 1,5 часа и позволит освоить правильный дистрибутив Python, программирование в выбранной среде IDE, а также отладку и написание надёжного кода с модульными тестами.

Если вы не используете интегрированную среду разработки, вам придётся *вводить* команды Windows в так называемое «окно DOS» или «окно командной строки». Обычно такое окно можно открыть через меню «Пуск»; в Windows 7 нужно выбрать *Пуск ‣ Программы ‣ Стандартные ‣ Командная строка*. Вы сможете определить, что окно открыто, по приглашению командной строки Windows, которое обычно выглядит так:

```python
C:\>
```

Буква может быть другой, и после неё могут быть ещё символы, так что можно увидеть, например, такое:

```python
D:\YourName\Projects\Python>
```

в зависимости от настроек компьютера и от недавних действий на нём. Как только такое окно открыто, можно смело приступать к запуску программ Python.

Нужно понимать, что ваши скрипты Python должны обрабатываться другой программой, называемой *интерпретатором* Python. Интерпретатор читает скрипт, компилирует его в байт-код, а затем выполняет байт-код для запуска программы. Итак, как сделать, чтобы интерпретатор обрабатывал ваш код Python?

Сначала необходимо убедиться, что окно командной строки воспринимает слово «python» как инструкцию для запуска интерпретатора. Если вы открыли командное окно, попробуйте ввести команду `python` и нажать клавишу Ввод.:

```python
C:\Users\YourName> python
```

После этого должно появиться примерно следующее:

```python
Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

Интерпретатор запущен в «интерактивном режиме». Это означает, что можно вводить операторы или выражения Python в интерактивном режиме и сразу же получать их выполнение или вычисление. Это одна из самых сильных сторон Python. Проверьте это, введя несколько выражений на свой выбор и увидев результаты:

```python
>>> print("Hello")
Hello
>>> "Hello" * 3
'HelloHelloHello'
```

Многие используют интерактивный режим как удобный, но при этом программируемый калькулятор. Чтобы завершить интерактивный сеанс Python, удерживайте клавишу `Ctrl`, нажмите `Z`, а затем клавишу «`Enter`», чтобы вернуться в командную строку Windows.

Также возможно, что у вас есть пункт меню «Пуск» вида *Пуск‣Программы‣Python 3.3‣Python (командная строка)*, при выборе которого открывается новое окно с приглашением `>>>`. В таком случае окно исчезнет после ввода символа `Ctrl-Z`; Windows выполняет в этом окне одну команду «python» и закрывает его при завершении интерпретатора.

Если команда `python` вместо отображения приглашения интерпретатора `>>>` выводит сообщение вида:

```python
'python' is not recognized as an internal or external command, operable program or batch file.
```

[![Добавление Python в путь DOS](https://python-all.ru/3.4/_images/python-video-icon.png)](https://python-all.ru/3.4/faq/windows.html)

[Добавление Python в путь DOS](https://python-all.ru/3.4/faq/windows.html)

Python не добавляется в путь DOS по умолчанию. Этот скринкаст покажет шаги по добавлению правильной записи в *системный путь*, что позволит всем пользователям запускать Python из командной строки.

или:

```python
Bad command or filename
```

тогда необходимо убедиться, что компьютер знает, где найти интерпретатор Python. Для этого нужно изменить переменную PATH – список каталогов, в которых Windows ищет программы.

Следует настроить добавление каталога установки Python в PATH каждого командного окна при его запуске. Если вы установили Python недавно, то команда

```python
dir C:\py*
```

скорее всего, сообщит, куда он установлен; обычное расположение – что-то вроде `C:\Python33`. В противном случае придётся искать по всему диску... воспользуйтесь пунктом *Инструменты‣Найти* или нажмите кнопку *Поиск* и найдите файл «python.exe». Предположим, вы обнаружили, что Python установлен в каталоге `C:\Python33` (по умолчанию на момент написания), тогда убедитесь, что ввод команды

```python
c:\Python33\python
```

запускает интерпретатор, как описано выше (и не забудьте, что для выхода потребуется «`Ctrl-Z`» и «`Enter`»). После того как вы убедились в расположении каталога, можно добавить его в системный путь, чтобы упростить запуск Python простым вводом команды `python`. Начиная с CPython 3.3 это опция установщика.

Дополнительную информацию о переменных среды можно найти на странице [*Использование Python в Windows*](https://python-all.ru/3.4/using/windows.html#setting-envvars).

## [Как сделать скрипты Python исполняемыми?](https://python-all.ru/3.4/faq/windows.html#id3)

В Windows стандартный установщик Python уже связывает расширение .py с типом файла (Python.File) и назначает этому типу команду открытия, запускающую интерпретатор (`D:\Program Files\Python\python.exe "%1"%*`). Этого достаточно, чтобы скрипты можно было запускать из командной строки как «foo.py». Если вы предпочитаете запускать скрипт простым вводом «foo» без расширения, необходимо добавить .py в переменную среды PATHEXT.

## [Почему Python иногда так долго запускается?](https://python-all.ru/3.4/faq/windows.html#id4)

Обычно Python запускается в Windows очень быстро, но иногда поступают сообщения об ошибках, что Python внезапно начинает долго запускаться. Это кажется ещё более странным, потому что на других системах Windows с, казалось бы, идентичной конфигурацией Python работает нормально.

Проблема может быть вызвана неправильной настройкой антивирусного ПО на проблемной машине. Известно, что некоторые антивирусные сканеры увеличивают время запуска на два порядка, если они настроены на мониторинг всех операций чтения файловой системы. Проверьте настройки антивирусного ПО на ваших системах, чтобы убедиться, что они действительно настроены одинаково. McAfee, будучи настроенным на сканирование всех операций чтения файловой системы, особенно этим грешит.

## [Как создать исполняемый файл из скрипта Python?](https://python-all.ru/3.4/faq/windows.html#id5)

Смотрите [http://cx-freeze.sourceforge.net/](https://python-all.ru/3.4/faq/windows.html) – расширение distutils, которое позволяет создавать консольные и графические исполняемые файлы из кода Python. [py2exe](https://python-all.ru/3.4/faq/windows.html), самое популярное расширение для сборки исполняемых файлов на основе Python 2.x, пока не поддерживает Python 3, но версия с такой поддержкой находится в разработке.

## [Является ли файл `*.pyd` тем же, что и DLL?](https://python-all.ru/3.4/faq/windows.html#id6)

Да, файлы .pyd – это DLL, но есть несколько отличий. Если у вас есть DLL с именем `foo.pyd`, то она должна содержать функцию `PyInit_foo()`. После этого можно написать «import foo» в Python, и Python будет искать foo.pyd (а также foo.py, foo.pyc) и, найдя его, попытается вызвать `PyInit_foo()` для инициализации. Не нужно линковать ваш .exe с foo.lib, так как это заставит Windows требовать наличия DLL.

Обратите внимание, что путь поиска для foo.pyd – это PYTHONPATH, а не тот путь, который Windows использует для поиска foo.dll. Кроме того, foo.pyd не обязательно должен присутствовать для запуска вашей программы, тогда как если вы слинковали программу с DLL, эта DLL требуется. Разумеется, foo.pyd необходим, если вы хотите написать `import foo`. В DLL связывание объявляется в исходном коде с помощью `__declspec(dllexport)`. В .pyd связывание определяется в списке доступных функций.

## [Как встроить Python в приложение Windows?](https://python-all.ru/3.4/faq/windows.html#id7)

Встраивание интерпретатора Python в приложение Windows можно резюмировать следующим образом:

1. Не встраивайте Python непосредственно в ваш .exe файл. В Windows Python должен быть DLL, чтобы обрабатывать импорт модулей, которые сами являются DLL. (Это первый ключевой недокументированный факт.) Вместо этого линкуйтесь с `pythonNN.dll`; обычно он устанавливается в `C:\Windows\System`. *NN* – это версия Python, например «33» для Python 3.3.

   Python можно линковать двумя способами. Линковка во время загрузки означает линковку с `pythonNN.lib`, а линковка во время выполнения – линковку с `pythonNN.dll`. (Общее замечание: `pythonNN.lib` – это так называемая «импортная библиотека», соответствующая `pythonNN.dll`. Она всего лишь определяет символы для линковщика.)

   Линковка во время выполнения значительно упрощает параметры линковки; всё происходит во время выполнения. Ваш код должен загрузить `pythonNN.dll` с помощью функции Windows `LoadLibraryEx()`. Код также должен использовать функции доступа и данные из `pythonNN.dll` (то есть C API Python) через указатели, полученные с помощью функции Windows `GetProcAddress()`. Макросы могут сделать использование этих указателей прозрачным для любого C-кода, вызывающего функции C API Python.

   Примечание для Borland: сначала преобразуйте `pythonNN.lib` в формат OMF с помощью Coff2Omf.exe.
2. Если вы используете SWIG, легко создать Python-«модуль расширения», который сделает данные и методы приложения доступными для Python. SWIG возьмет на себя практически все рутинные детали. В результате получается код на C, который вы встраиваете *в* свой .exe-файл (!) Вам не нужно создавать DLL-файл, и это также упрощает связывание.
3. SWIG создаст функцию инициализации (функцию на C), имя которой зависит от имени модуля расширения. Например, если модуль называется leo, функция инициализации будет называться initleo(). Если вы используете классы-тени SWIG (а это стоит делать), функция инициализации будет называться initleoc(). Она инициализирует в основном скрытый вспомогательный класс, используемый классом-тенью.

   Причина, по которой можно скомпоновать код на C из шага 2 прямо в .exe-файл, в том, что вызов функции инициализации эквивалентен импорту модуля в Python! (Это второй ключевой недокументированный факт.)
4. Кратко: следующий код позволяет инициализировать интерпретатор Python вместе с вашим модулем расширения.

   ```c
   #include "python.h"
   ...
   Py_Initialize();  // Инициализировать Python.
   initmyAppc();  // Инициализировать (импортировать) вспомогательный класс.
   PyRun_SimpleString("import myApp");  // Импортировать теневой класс.
   ```
5. Есть две проблемы с C API Python, которые проявятся, если вы используете компилятор, отличный от MSVC (компилятор, которым собрана pythonNN.dll).

   Проблема 1: Так называемые «очень высокоуровневые» функции, принимающие аргументы FILE \*, не будут работать в среде с несколькими компиляторами, поскольку каждый компилятор имеет свое представление о struct FILE. С точки зрения реализации это очень \_низкоуровневые\_ функции.

   Проблема 2: SWIG генерирует следующий код при создании обёрток для функций, возвращающих void:

   ```c
   Py_INCREF(Py_None);
   _resultobj = Py_None;
   return _resultobj;
   ```

   Увы, Py\_None – это макрос, который разворачивается в ссылку на сложную структуру данных \_Py\_NoneStruct внутри pythonNN.dll. И этот код тоже не будет работать в среде с несколькими компиляторами. Замените такой код на:

   ```c
   return Py_BuildValue("");
   ```

   Возможно, для автоматического внесения изменений можно использовать команду SWIG `%typemap`, хотя мне не удалось заставить это работать (я полный новичок в SWIG).
6. Использовать скрипт оболочки Python для вызова окна интерпретатора из вашего Windows-приложения – плохая идея: полученное окно будет независимо от оконной системы приложения. Вместо этого вам (или классу wxPythonWindow) следует создать «родное» окно интерпретатора. Подключить это окно к интерпретатору Python несложно. Вы можете перенаправить ввод-вывод Python на \_любой\_ объект, поддерживающий чтение и запись, так что всё, что нужно – это объект Python (определённый в вашем модуле расширения) с методами read() и write().

## [How do I keep editors from inserting tabs into my Python source?](https://python-all.ru/3.4/faq/windows.html#id8)

The FAQ does not recommend using tabs, and the Python style guide, [**PEP 8**](https://python-all.ru/3.4/faq/windows.html), recommends 4 spaces for distributed Python code; this is also the Emacs python-mode default.

Under 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.

Если вы подозреваете, что смешение табуляции и пробелов вызывает проблемы в начальных отступах, запустите Python с ключом [*-t*](https://python-all.ru/3.4/library/tarfile.html#cmdoption-t) или выполните `Tools/Scripts/tabnanny.py` для проверки дерева каталогов в пакетном режиме.

## [How do I check for a keypress without blocking?](https://python-all.ru/3.4/faq/windows.html#id9)

Используйте модуль msvcrt. Это стандартный модуль расширения для Windows. Он определяет функцию `kbhit()`, которая проверяет, есть ли нажатие клавиши, и `getch()`, которая получает один символ без его отображения.

## [Как эмулировать os.kill() в Windows?](https://python-all.ru/3.4/faq/windows.html#id10)

До Python 2.7 и 3.2 для завершения процесса можно было использовать [`ctypes`](https://python-all.ru/3.4/library/ctypes.html#module-ctypes):

```python
import ctypes

def kill(pid):
    """функция kill для Win32"""
    kernel32 = ctypes.windll.kernel32
    handle = kernel32.OpenProcess(1, 0, pid)
    return (0 != kernel32.TerminateProcess(handle, 0))
```

В версиях 2.7 и 3.2 [`os.kill()`](https://python-all.ru/3.4/library/os.html#os.kill) реализована аналогично вышеописанной функции, с дополнительной возможностью отправлять `Ctrl+C` и `Ctrl+Break` консольным подпроцессам, которые предназначены для обработки этих сигналов. Подробнее см. [`os.kill()`](https://python-all.ru/3.4/library/os.html#os.kill).

## [Как извлечь загруженную документацию в Windows?](https://python-all.ru/3.4/faq/windows.html#id11)

Иногда при загрузке пакета документации в Windows через браузер расширение сохранённого файла оказывается .EXE. Это ошибка; расширение должно быть .TGZ.

Просто переименуйте загруженный файл, чтобы расширение стало .TGZ, и WinZip сможет его обработать. (Если ваша версия WinZip не может, загрузите новую с [http://www.winzip.com](https://python-all.ru/3.4/faq/windows.html).)
