Часто задаваемые вопросы о Python в Windows
- Как запустить программу Python в Windows?
- Как сделать скрипты Python исполняемыми?
- Почему иногда запуск Python занимает так много времени?
- Как создать исполняемый файл из скрипта Python?
- Файл
*.pyd— это то же самое, что DLL? - Как встроить Python в приложение Windows?
- Как запретить редакторам вставлять символы табуляции в исходный код Python?
- Как проверить нажатие клавиши, не блокируя выполнение программы?
- Как устранить ошибку отсутствия api-ms-win-crt-runtime-l1-1-0.dll?
Как запустить программу Python в Windows?
На этот вопрос не всегда можно ответить однозначно. Если вы уже знакомы с запуском программ из командной строки Windows, всё покажется очевидным; в противном случае вам может понадобиться небольшое пояснение.
Если вы не используете интегрированную среду разработки, вам придётся вводить команды Windows в так называемом «окне командной строки». Обычно такое окно можно открыть через строку поиска, выполнив поиск по запросу cmd. Вы поймёте, что открыли такое окно, когда увидите «командную строку» Windows, которая обычно выглядит так:
C:\>
Буква может отличаться, а после неё могут быть другие символы, поэтому вы можете увидеть, например, что-то вроде:
D:\YourName\Projects\Python>
Это зависит от настроек компьютера и от того, что вы недавно на нём делали. Открыв такое окно, вы уже почти готовы запускать программы Python.
Важно понимать, что ваши скрипты Python должен обрабатывать другая программа, называемая интерпретатором Python. Интерпретатор читает скрипт, компилирует его в байт-код, а затем выполняет байт-код, запуская программу. Итак, как указать интерпретатору обработать ваш код Python?
Для начала нужно убедиться, что окно командной строки распознаёт слово «py» как команду для запуска интерпретатора. Если вы открыли окно командной строки, попробуйте ввести команду py и нажать клавишу Enter:
C:\Users\YourName> py
После этого вы должны увидеть что-то вроде:
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>>
Вы запустили интерпретатор в «интерактивном режиме». Это значит, что вы можете вводить инструкции или выражения Python и выполнять или вычислять их прямо во время работы. Это одна из самых сильных сторон Python. Проверьте это, введя несколько выражений на свой выбор и посмотрев на результаты:
>>> print("Hello")
Hello
>>> "Hello" * 3
'HelloHelloHello'
Многие используют интерактивный режим как удобный, но при этом хорошо программируемый калькулятор. Чтобы завершить интерактивный сеанс Python, вызовите функцию exit() или, удерживая клавишу Ctrl, нажмите Z, а затем нажмите клавишу «Enter», чтобы вернуться к командной строке Windows.
В меню «Пуск» также может быть пункт вроде , при выборе которого в новом окне появляется приглашение >>>. В этом случае окно закроется после вызова функции exit() или ввода символа Ctrl-Z; Windows запускает в этом окне одну команду «python» и закрывает его после завершения работы интерпретатора.
Теперь, когда мы знаем, что команда py распознаётся, можно передать ей скрипт Python. Нужно указать абсолютный или относительный путь к скрипту Python. Предположим, ваш скрипт Python находится на рабочем столе и называется hello.py, а командная строка открыта в вашей домашней папке, поэтому вы видите что-то похожее на:
C:\Users\YourName>
Теперь нужно указать команде py передать скрипт Python: введите py, а затем путь к скрипту:
C:\Users\YourName> py Desktop\hello.py hello
Как сделать скрипты Python исполняемыми?
В Windows стандартный установщик Python уже связывает расширение .py с типом файла (Python.File) и задаёт для этого типа команду открытия, запускающую интерпретатор (D:\Program Files\Python\python.exe "%1"
%*). Этого достаточно, чтобы запускать скрипты из командной строки, вводя «foo.py». Если вы хотите запускать скрипт, просто вводя «foo» без расширения, добавьте .py в переменную среды PATHEXT.
Почему иногда запуск Python занимает так много времени?
Обычно Python запускается в Windows очень быстро, однако время от времени появляются сообщения об ошибках, в которых говорится, что Python внезапно стал запускаться очень долго. Ещё больше недоумения вызывает то, что на других системах Windows, настроенных, по-видимому, так же, Python работает нормально.
Причиной может быть неправильная настройка антивирусного ПО на проблемном компьютере. Известно, что некоторые антивирусные сканеры могут увеличивать время запуска в сто раз, если настроены проверять все операции чтения файловой системы. Проверьте настройки антивирусного ПО на своих системах и убедитесь, что они действительно настроены одинаково. Антивирус McAfee особенно часто вызывает эту проблему, если настроен проверять все операции чтения файловой системы.
Как создать исполняемый файл из скрипта Python?
Список инструментов, с помощью которых можно создавать исполняемые файлы, см. в разделе Как создать автономный исполняемый файл из скрипта Python?.
Файл *.pyd — это то же самое, что DLL?
Да, файлы .pyd — это DLL, но есть несколько отличий. Если у вас есть DLL с именем foo.pyd, в ней должна быть функция PyInit_foo(). Затем можно написать в Python «import foo», и Python выполнит поиск foo.pyd (а также foo.py, foo.pyc) и, если найдёт файл, попытается вызвать PyInit_foo() для его инициализации. Не нужно связывать ваш .exe с foo.lib, поскольку из-за этого Windows потребовала бы наличия DLL.
Обратите внимание: путь поиска foo.pyd — это PYTHONPATH, а не тот путь, по которому Windows ищет foo.dll. Кроме того, для запуска программы файл foo.pyd может не требоваться, тогда как DLL необходима, если программа связана с ней. Разумеется, foo.pyd нужен, если вы хотите написать import foo. В DLL связывание объявляется в исходном коде с помощью __declspec(dllexport). В файле .pyd связывание задаётся списком доступных функций.
Как встроить Python в приложение Windows?
Встраивание интерпретатора Python в приложение Windows можно описать следующим образом:
-
Не собирайте 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с помощью функции WindowsLoadLibraryEx(). Кроме того, код должен обращаться к функциям и данным вpythonNN.dll(то есть к API Python для C), используя указатели, полученные с помощью функции WindowsGetProcAddress(). Макросы позволяют скрыть использование этих указателей от любого кода на C, вызывающего функции API Python для C. - Если вы используете SWIG, создать «модуль расширения» Python, который предоставит Python доступ к данным и методам приложения, несложно. SWIG возьмёт на себя почти все утомительные подробности. В результате получится код на C, который связывается непосредственно с вашим файлом .exe (!) Создавать DLL не нужно, что также упрощает связывание.
-
SWIG создаст функцию инициализации (функцию на C), имя которой зависит от имени модуля расширения. Например, если модуль называется leo, функция инициализации будет называться initleo(). Если вы используете теневые классы SWIG, как и следует, функция инициализации будет называться initleoc(). Она инициализирует вспомогательный класс, в основном скрытый и используемый теневым классом.
Код на C из шага 2 можно связать с файлом .exe, потому что вызов функции инициализации эквивалентен импорту модуля в Python! (Это второй важный факт, который обычно не документируют.)
-
Короче говоря, для инициализации интерпретатора Python с модулем расширения можно использовать следующий код.
#include <Python.h> ... Py_Initialize(); // Initialize Python. initmyAppc(); // Initialize (import) the helper class. PyRun_SimpleString("import myApp"); // Import the shadow class. -
У API Python для C есть две проблемы, которые проявятся, если вы используете компилятор, отличный от MSVC — компилятора, с помощью которого собран pythonNN.dll.
Проблема 1. Так называемые функции «очень высокого уровня», принимающие аргументы
FILE *, не будут работать в среде с несколькими компиляторами, поскольку представлениеstruct FILEу каждого компилятора отличается. С точки зрения реализации это очень низкоуровневые функции.Проблема 2. При создании обёрток для функций void SWIG генерирует следующий код:
Py_INCREF(Py_None); _resultobj = Py_None; return _resultobj;
К сожалению, Py_None — это макрос, который раскрывается в ссылку на сложную структуру данных _Py_NoneStruct внутри pythonNN.dll. И снова этот код не будет работать в среде с несколькими компиляторами. Замените такой код следующим:
return Py_BuildValue("");Возможно, команду
%typemapв SWIG можно использовать для автоматического внесения этого изменения, хотя мне не удалось заставить её работать (я совсем новичок в SWIG). - Использовать скрипт Python для запуска окна интерпретатора Python из приложения Windows — не лучшая идея: это окно будет независимо от оконной системы приложения. Вместо этого вам (или классу wxPythonWindow) следует создать «родное» окно интерпретатора. Подключить такое окно к интерпретатору Python несложно. Ввод-вывод Python можно перенаправить на _любой_ объект, который поддерживает чтение и запись, поэтому достаточно создать объект Python (определённый в модуле расширения) с методами read() и write().
Как запретить редакторам вставлять символы табуляции в исходный код Python?
В FAQ не рекомендуется использовать символы табуляции, а руководство по стилю Python PEP 8 рекомендует использовать для распространяемого кода Python 4 пробела; это также значение по умолчанию в режиме python-mode редактора Emacs.
В любом редакторе смешивать табуляцию и пробелы — плохая идея. MSVC в этом отношении не исключение, но его легко настроить на использование пробелов: откройте , для типа файлов «По умолчанию» установите значения «Размер табуляции» и «Размер отступа» равными 4 и выберите переключатель «Вставлять пробелы».
Python выдаёт исключение IndentationError или TabError, если смешение табуляции и пробелов вызывает проблемы в начальных пробельных символах. Также можно запустить модуль tabnanny, чтобы проверить дерево каталогов в пакетном режиме.
Как проверить нажатие клавиши, не блокируя выполнение программы?
Используйте модуль msvcrt. Это стандартный модуль расширения, предназначенный только для Windows. В нём определена функция kbhit(), проверяющая, нажата ли клавиша, и функция getch(), которая считывает один символ без отображения его на экране.
Как устранить ошибку отсутствия api-ms-win-crt-runtime-l1-1-0.dll?
Эта ошибка может возникать в Python 3.5 и более поздних версиях при использовании Windows 8.1 или более ранней версии, если установлены не все обновления. Сначала убедитесь, что ваша операционная система поддерживается и обновлена. Если это не решит проблему, ознакомьтесь с инструкциями на странице поддержки Microsoft по установке обновления C Runtime вручную.
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/faq/windows.html