Spec-Zone.ru › Python 3.9

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

  • Как запустить программу Python в Windows?
  • Как сделать скрипты Python исполняемыми?
  • Почему Python иногда долго запускается?
  • Как создать исполняемый файл из скрипта Python?
  • Является ли файл *.pyd таким же, как DLL?
  • Как встроить Python в приложение Windows?
  • Как предотвратить вставка табуляции в мой исходный код Python?
  • Как проверить нажатие клавиши без блокировки?

Как запустить программу 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.

Возможно, у вас есть пункт меню «Пуск» типа Пуск ‣ Программы ‣ 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?

См. Как создать автономный двоичный файл из скрипта 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 связь определяется в списке доступных функций.

END_OF_DOCUMENT_MARKER

Как встроить интерпретатор 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 — так называемая «библиотека импорта», соответствующая pythonNN.dll. Она просто определяет символы для компоновщика.)

    Связывание во время выполнения значительно упрощает параметры компоновки; всё происходит во время выполнения. Ваш код должен загрузить pythonNN.dll с помощью функции Windows LoadLibraryEx(). Код также должен использовать функции доступа и данные в pythonNN.dll (то есть, C API Python) с помощью указателей, полученных с помощью функции Windows GetProcAddress(). Макросы могут сделать использование этих указателей прозрачными для любого кода C, который вызывает функции C API Python.

  2. Если вы используете SWIG, легко создать «модуль расширения» Python, который сделает данные и методы приложения доступными для Python. SWIG обработает почти все грязные детали за вас. Результатом является код C, который вы связываете _в_ свой исполняемый файл (.exe) (!) Вам не нужно создавать файл DLL, а это также упрощает компоновку.
  3. SWIG создаст функцию инициализации (функцию C), имя которой зависит от имени модуля расширения. Например, если имя модуля — leo, функция инициализации будет называться initleo(). Если вы используете теневые классы SWIG, как и следует, функция инициализации будет называться initleoc(). Это инициализирует скрытый вспомогательный класс, используемый теневым классом.

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

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

    #include "python.h"
    ...
    Py_Initialize();  // Initialize Python.
    initmyAppc();  // Initialize (import) the helper class.
    PyRun_SimpleString("import myApp");  // Import the shadow class.
    
  5. Существуют две проблемы с 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("");
    

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

  6. Использование скрипта оболочки 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.9/faq/windows.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API