Часто задаваемые вопросы по Python в Windows

Как запустить программу 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 (command line), который приводит к отображению приглашения >>> в новом окне. В этом случае окно исчезнет после вызова функции 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) и предоставляет этому типу файла команду open, которая вызывает интерпретатор (D:\Program Files\Python\python.exe "%1" %*). Этого достаточно, чтобы сделать скрипты исполняемыми из командной строки как „foo.py“. Для выполнения сценария простым вводом «foo» без расширения необходимо добавить .py в переменную среды PATHEXT.

Почему Python иногда так долго стартует?

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

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

Как сделать исполняемый файл из Python сценария?

См. cx_Freeze для расширения distutils, которое позволяет создавать исполняемые файлы консоли и графического интерфейса пользователя из кода Python. py2exe, самое популярное расширение для создания исполняемых файлов на основе Python 2.x, еще не поддерживает Python 3, но его версия находится в разработке.

Является ли файл *.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 можно следующим образом:

  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 - это так называемый «import 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, функция init будет вызываться initleo(). При использовании теневых классов SWIG функция init будет вызываться initleoc(). При этом инициализируется в основном скрытый вспомогательный класс, используемый теневым классом.

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

  4. Короче говоря, вы можете использовать следующий код для инициализации интерпретатора Python с вашим модулем расширения.

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

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

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

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

    Увы, Py_None - это макрос, который расширяется до ссылки на сложную структуру данных, вызываемую _Py_NoneStruct внутри pythonN.dll. Опять же, этот код будет сбой в среде с несколькими компиляторами. Замените таким кодом:

    return Py_BuildValue("");
    

    Возможно, можно использовать %typemap команду SWIG для автоматического внесения изменений, хотя я не смог получить это для работы (я полный новичок SWIG).

  6. Использование скрипта Python оболочки для открытия Python окна интерпретатора внутри приложения Windows не является хорошей идеей; полученное окно не зависит от оконной системы вашего приложения. Скорее, вы (или класс wxPythonWindow) должны создать «родное» окно интерпретатора. Это окно легко подключить к Python интерпретатору. Можно перенаправить Python i/o на _любой_ объект поддерживающий чтение и запись, поэтому все, что вам нужно, это Python объект (определенный в модуле расширения), содержащий методы read() и write().

Как запретить редакторам вставлять табы в Python исходник?

Часто задаваемые вопросы не рекомендуют использовать табы, а руководство по стилю Python, PEP 8, рекомендует 4 пробела для распространяемого Python кода; это также значение по умолчанию в Python-режиме Emacs.

В любом редакторе смешение табов и пробелов - плохая идея. MSVC в этом отношении ничем не отличается и легко настраивается на использование пробелов: перейдите в Tools ‣ Options ‣ Tabs и для типа файла «Default» установите значения «Tab size» и «Indent size» в 4, и установите переключатель «Insert spaces».

Python вызывает IndentationError или TabError, если смешение табов и пробелов вызывают проблемы в ведущем пробеле. Можно также запустить модуль tabnanny для проверки дерева каталогов в пакетном режиме.

Как проверить нажатие клавиш без блокировки?

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