Часто задаваемые вопросы о 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 находится на рабочем столе и называется hello.py, а командная строка открыта в вашей домашней папке и выглядит примерно так:
C:\Users\YourName>
Теперь передайте сценарий Python команде py, введя 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 эта 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("");Возможно, для автоматического внесения этого изменения можно использовать команду
%typemapSWIG, но мне не удалось заставить её работать (я совсем новичок в SWIG). - Использовать сценарий оболочки Python для открытия окна интерпретатора Python из приложения Windows — плохая идея: такое окно будет независимо от оконной системы вашего приложения. Вместо этого вам (или классу wxPythonWindow) следует создать «родное» окно интерпретатора. Подключить его к интерпретатору Python легко. Ввод-вывод Python можно перенаправить на _любой_ объект, поддерживающий методы чтения и записи, поэтому вам понадобится лишь объект Python (определённый в модуле расширения) с методами read() и write().
Как запретить редакторам вставлять символы табуляции в исходный код Python?
В этом разделе часто задаваемых вопросов не рекомендуется использовать символы табуляции. Руководство по стилю 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.
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/faq/windows.html