Spec-Zone.ru › Python 3.10

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.

Вам необходимо убедиться, что ваша командная строка распознаёт слово «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 выполнить ваш скрипт, набрав 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, так как это потребует наличия DLL в Windows.

Обратите внимание, что путь поиска для 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 в свой файл .exe, заключается в том, что вызов функции инициализации эквивалентен импорту модуля в 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 * аргументы, не будут работать в многокомпиляторной среде, потому что представление struct 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 в 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/faq/windows.html

Spec-Zone.ru

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