Это первая часть Распространения приложений Python для настольных компьютеров Windows. Это самая основная часть, и этот вопрос обсуждался на многих веб-сайтах, но моя идея здесь состоит в том, чтобы представить, как я создал пример программы, и показать, как создать простой установщик MSI с необходимыми библиотеками DLL для работы в Windows.
Каждому исполняемому файлу Python требуются библиотеки времени выполнения C ++ для работы в Windows. Вы, должно быть, слышали о нем как о Microsoft Visual C ++ Redistributable или можете найти его как MSVCR. Версия, которая вам понадобится, зависит от того, какую версию Python вы используете.

Итак, что мы собираемся делать:

  1. Наша программа в файлах python
  2. Напишите установочный файл для исполняемого файла
  3. Создайте установщик MSI

Хорошо, я создаю глупый сценарий, который использовал, чтобы троллить одного из моих друзей. Это заменит функцию клавиш Print Screen, и каждый раз при нажатии клавиши появляется изображение куклы. Я назвал его Boneca (по-португальски «кукла»).

#boneca.py
import os
import sys
import ctypes
from ctypes import wintypes
import win32con

byref = ctypes.byref
user32 = ctypes.windll.user32

HOTKEYS = {
    1 : (win32con.VK_SNAPSHOT, 0), ####Essa Linha Pega a tecla "PRINT SCREEN"
    2 : (win32con.VK_F4, win32con.MOD_WIN)
}

def handle_print_screen ():
    os.startfile(os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])),"boneca.jpg"))

def handle_win_f4 ():
    user32.PostQuitMessage (0)

HOTKEY_ACTIONS = {
    1 : handle_print_screen,
    2 : handle_win_f4
}


# Registering the keys without the print
for id, (vk, modifiers) in HOTKEYS.items ():
    #print "Registering id", id, "for key", vk
    pass
    if not user32.RegisterHotKey (None, id, modifiers, vk):
        #print "Unable to register id", id
        pass


# Executando as funções e tirando o registro das chaves depois do encerramento do programa.
try:
    msg = wintypes.MSG ()
    while user32.GetMessageA (byref (msg), None, 0, 0) != 0:
        if msg.message == win32con.WM_HOTKEY:
            action_to_take = HOTKEY_ACTIONS.get (msg.wParam)
            if action_to_take:
                action_to_take ()

        user32.TranslateMessage (byref (msg))
        user32.DispatchMessageA (byref (msg))

finally:
    for id in HOTKEYS.keys ():
        user32.UnregisterHotKey (None, id)

В качестве ссылки на этот код я использовал сообщение Тима Голдена [1].

По сути, этот код создает два ярлыка в окнах, один для Print Screen, который при нажатии вызывает функцию handle_print_screen, которая вызывает файл boneca.jpg. Другой ярлык вызывает handle_win_f4 для выхода из программы. У него нет графического интерфейса, поэтому в этом есть смысл.

Все идет нормально. Это очень простой скрипт, но теперь мы должны заморозить наш код, что означает, что мы скомпилируем скрипт и сгенерируем исполняемый файл, содержащий интерпретатор python, модули и файлы, все в одном месте. Для этого нам понадобится установочный файл и мы выберем один инструмент для замораживания нашего приложения, например py2exe, py2app, cx_freeze или pyinstaller. В этом случае мы будем использовать cx_freeze.

#setup.py
from cx_Freeze import setup, Executable

setup(
    name = "boneca",
    version = "1.0.0",
    options = {"build_exe": {
        'packages': ["os","sys","ctypes","win32con"],
        'include_files': ['boneca.jpg'],
        'include_msvcr': True,
    }},
    executables = [Executable("boneca.py",base="Win32GUI")]
    )

Это очень просто и задокументировано как disutils. Но послушайте, мы используем include_msvcr, который добавит распространяемые библиотеки DLL Microsoft Visual C ++ в ваш исполняемый файл. Он скопирует существующие библиотеки DLL вашей ОС (если вы используете Windows). Только так ваша программа будет работать в другой Windows, потому что ей нужны эти библиотеки DLL. Также вы можете загрузить установщик MSVCR и включить его в свой собственный установщик, например, с помощью Inno Setup. Мы сделаем это в 3-м посте.

Теперь сгенерируем MSI с помощью командной строки:

python setup.py bdist_msi

Хорошо, теперь у нас есть папка dist с файлом boneca-1.0.0-win32.msi внутри или boneca-1.0.0-amd64.msi (для ОС x64) и теперь вы можете установить и использовать программу.

Скрипты на моем GitHub: https://github.com/ffreitasalves/boneca

Изначально он был опубликован на португальском.

[1]: http://timgolden.me.uk/python/win32_how_do_i/catch_system_wide_hotkeys.html

Изначально опубликовано в Фернандо Алвес.