# Поширені запитання про Python у Windows

## Як запустити програму Python під Windows?

Це не обов’язково однозначне запитання. Якщо ви вже знайомі із запуском програм із командного рядка Windows, то все буде здаватися очевидним; інакше вам може знадобитися трохи більше вказівок.

Якщо ви не використовуєте якесь інтегроване середовище розробки, вам доведеться вводити команди Windows у так зване «вікно командного рядка». Зазвичай ви можете створити таке вікно з панелі пошуку, виконавши пошук за `cmd`. Ви повинні мати змогу розпізнати, коли ви запустили таке вікно, оскільки ви побачите «командний рядок» Windows, який зазвичай виглядає так:

    C:\>

Літера може бути іншою, і після неї можуть бути інші речі, тому ви можете так само легко побачити щось на зразок:

    D:\YourName\Projects\Python>

залежно від того, як налаштовано ваш комп’ютер і що ще ви нещодавно з ним робили. Як тільки ви запустили таке вікно, ви вже на шляху до запуску програм Python.

Ви повинні усвідомити, що ваші сценарії Python мають оброблятися іншою програмою під назвою інтерпретатор Python. Інтерпретатор читає ваш сценарій, компілює його в байт-коди, а потім виконує байт-коди для запуску вашої програми. Отже, як організувати роботу інтерпретатора з вашим Python?

По-перше, вам потрібно переконатися, що ваше командне вікно розпізнає слово «py» як інструкцію для запуску інтерпретатора. Якщо ви відкрили командне вікно, спробуйте ввести команду `py` і натиснути клавішу return:

    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 зв’язок визначається у списку доступних функцій.

## Як я можу вставити Python у програму Windows?

Вбудовування інтерпретатора Python у програму Windows можна підсумувати таким чином:

1. Do not build Python into your .exe file directly. On Windows, Python must be a DLL to handle importing modules that are themselves DLL’s. (This is the first key undocumented fact.) Instead, link to `pythonNN.dll`; it is typically installed in `C:\Windows\System`. NN is the Python version, a number such as «33» for Python 3.3.

   Ви можете зв’язатися з Python двома різними способами. Зв’язування під час завантаження означає зв’язування з `pythonNN.lib`, тоді як зв’язування під час виконання означає зв’язування з `pythonNN.dll`. (Загальна примітка: `pythonNN.lib` — це так звана «імпортована бібліотека», яка відповідає `pythonNN.dll`. Вона лише визначає символи для компонувальника.)

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

2. If you use SWIG, it is easy to create a Python «extension module» that will make the app’s data and methods available to Python. SWIG will handle just about all the grungy details for you. The result is C code that you link into your .exe file (!) You do not have to create a DLL file, and this also simplifies linking.

3. SWIG створить функцію ініціалізації (функцію C), назва якої залежить від назви модуля розширення. Наприклад, якщо назва модуля leo, функція init буде називатися initleo(). Якщо ви використовуєте тіньові класи SWIG, як і має бути, функція init називатиметься 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.

   Problem 1: The so-called «Very High Level» functions that take `FILE *` arguments will not work in a multi-compiler environment because each compiler’s notion of a `struct FILE` will be different. From an implementation standpoint these are very low level functions.

   Проблема 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; це також стандартний режим Emacs python.

У будь-якому редакторі змішувати табуляції та пробіли – погана ідея. MSVC нічим не відрізняється в цьому відношенні, і його легко налаштувати для використання пробілів: візьміть Інструменти ‣ Параметри ‣ Вкладки, а для типу файлу «За замовчуванням» встановіть «Розмір вкладки» та «Розмір відступу» на 4 і виберіть перемикач «Вставити пробіли».

Python викликає `IndentationError` або `TabError`, якщо змішані символи табуляції та пробіли спричиняють проблеми на початку пробілу. Ви також можете запустити модуль `tabnanny`, щоб перевірити дерево каталогів у пакетному режимі.

## Як перевірити натискання клавіш без блокування?

Використовуйте модуль `msvcrt`. Це стандартний модуль розширення для Windows. Він визначає функцію `kbhit()`, яка перевіряє наявність натискання клавіатури, і `getch()`, яка отримує один символ, не повторюючи його.

## How do I solve the missing api-ms-win-crt-runtime-l1-1-0.dll error?

This can occur on Python 3.5 and later when using Windows 8.1 or earlier without all updates having been installed. First ensure your operating system is supported and is up to date, and if that does not resolve the issue, visit the Microsoft support page for guidance on manually installing the C Runtime update.