Часто задаваемые вопросы о 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 и нажать клавишу ВВОД:
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); если файл будет найден, Python попытается вызвать 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(то есть C API Python), используя указатели, полученные с помощью процедуры WindowsGetProcAddress(). Макросы позволяют прозрачно использовать эти указатели в любом коде C, который вызывает функции C API Python. - Если вы используете 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. -
При использовании компилятора, отличного от MSVC (компилятора, с помощью которого был собран pythonNN.dll), обнаружатся две проблемы C API Python.
Проблема 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/faq/windows.html