Часто задаваемые вопросы по Python в Windows
- Как запустить программу Python в Windows?
- Как сделать скрипты Python исполняемыми?
- Почему Python иногда долго запускается?
- Как создать исполняемый файл из скрипта Python?
- Является ли файл
*.pydтаким же, как DLL? - Как встроить Python в приложение Windows?
- Как предотвратить вставку табуляций в код Python редакторами?
- Как проверить нажатие клавиши без блокировки?
Как запустить программу Python в Windows?
Это не обязательно простой вопрос. Если вы уже знакомы с запуском программ из командной строки Windows, всё будет очевидно; в противном случае, вам может потребоваться дополнительное руководство.
Если вы не используете какую-либо интегрированную среду разработки, вам придётся вводить команды Windows в окно, которое иногда называют «окно DOS» или «окно командной строки». Обычно вы можете создать такое окно из строки поиска, введя 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.
Вы также можете найти пункт меню «Пуск ‣ Программы ‣ Python 3.x ‣ Python (командная строка)», который откроет окно с приглашением >>>. В таком случае окно исчезнет после вызова функции 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 внезапно начинает долго запускаться. Это ещё более загадочно, потому что Python работает нормально на других системах Windows, которые, по-видимому, настроены идентично.
Проблема может быть вызвана неправильной настройкой антивирусного программного обеспечения на проблемном компьютере. Некоторые антивирусные сканеры известны тем, что вносят задержку на два порядка при запуске, когда сканер настроен на мониторинг всех операций чтения с файловой системы. Попробуйте проверить конфигурацию антивирусного программного обеспечения на ваших системах, чтобы убедиться, что они настроены идентично. McAfee, при настройке на сканирование всех операций чтения с файловой системы, является особенно проблемным случаем.
Как создать исполняемый файл из скрипта Python?
См. cx_Freeze и py2exe, обе являются расширениями distutils, которые позволяют создавать консольные и графические исполняемые файлы из кода 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(то есть, C API Python) с помощью указателей, полученных с помощью WindowsGetProcAddress()процедуры. Макросы могут сделать использование этих указателей прозрачными для любого кода C, вызывающего процедуры C API Python.Примечание для Borland: сначала преобразуйте
pythonNN.libв формат OMF с помощью Coff2Omf.exe. - Если вы используете SWIG, легко создать модуль расширения Python, который сделает данные и методы приложения доступными для Python. SWIG обработает практически все грязные детали за вас. Результатом является код C, который вы связываете в свой исполняемый файл (!). Вам не нужно создавать файл DLL, и это также упрощает компоновку.
-
SWIG создаст функцию инициализации (функцию C), имя которой зависит от имени модуля расширения. Например, если имя модуля — leo, функция инициализации будет называться initleo(). Если вы используете тенированные классы SWIG, как и следует, функция инициализации будет называться initleoc(). Это инициализирует в основном скрытый вспомогательный класс, используемый тенированным классом.
Причина, по которой вы можете связать код C в шаге 2 со своим исполняемым файлом, заключается в том, что вызов функции инициализации эквивалентен импорту модуля в Python! (Это второй ключевой недокументированный факт.)
-
Короче говоря, вы можете использовать следующий код для инициализации интерпретатора Python с вашим модулем расширения.
#include "python.h" ... Py_Initialize(); // Initialize Python. initmyAppc(); // Initialize (import) the helper class. PyRun_SimpleString("import myApp"); // Import the shadow class. -
Существуют две проблемы с C API Python, которые проявятся, если вы используете компилятор, отличный от MSVC, компилятор, используемый для построения pythonNN.dll.
Проблема 1: так называемые функции «Очень высокого уровня», принимающие аргумент FILE *, не будут работать в многокомпиляторной среде, потому что представление структуры FILE каждого компилятора будет отличаться. С точки зрения реализации это функции очень _низкого_ уровня.
Проблема 2: SWIG генерирует следующий код при генерации обёртки для функций void:
Py_INCREF(Py_None); _resultobj = Py_None; return _resultobj;
К сожалению, Py_None — макрос, который расширяется до ссылки на сложную структуру данных под названием _Py_NoneStruct внутри pythonNN.dll. Опять же, этот код потерпит неудачу в многокомпиляторной среде. Замените такой код на:
return Py_BuildValue("");Возможно, можно использовать команду SWIG
%typemapдля автоматического внесения изменений, хотя мне не удалось добиться этого (я полный новичок в SWIG). - Использование скрипта оболочки Python для отображения окна интерпретатора Python изнутри вашего приложения Windows — не лучшая идея; результирующее окно будет независимым от системы окон вашего приложения. Скорее, вы (или класс wxPythonWindow) должны создать «родное» окно интерпретатора. Легко подключить это окно к интерпретатору Python. Вы можете перенаправить ввод/вывод Python в _любой_ объект, поддерживающий чтение и запись, поэтому всё, что вам нужно, — это объект Python (определённый в модуле расширения), содержащий методы read() и write().
Как предотвратить вставку табуляции редакторами в мой исходный код Python?
FAQ не рекомендует использовать табуляцию, а руководство по стилю Python, PEP 8, рекомендует 4 пробела для распределённого кода Python; это также значение по умолчанию для режима python-mode в Emacs.
В любом редакторе смешивание табуляции и пробелов — плохая идея. MSVC в этом отношении ничем не отличается и легко настраивается на использование пробелов: выберите , и для типа файла «По умолчанию» установите «Размер табуляции» и «Размер отступа» в 4 и выберите радиокнопку «Вставлять пробелы».
Python генерирует IndentationError или TabError, если смешанные табуляции и пробелы вызывают проблемы с ведущими пробелами. Вы также можете запустить модуль tabnanny, чтобы проверить дерево каталогов в пакетном режиме.
Как проверить нажатие клавиши без блокировки?
Используйте модуль msvcrt. Это стандартный модуль расширения, специфичный для Windows. Он определяет функцию kbhit() , которая проверяет наличие нажатия клавиши, и getch() , которая получает один символ без его отображения.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/faq/windows.html