Это первая часть Распространения приложений Python для настольных компьютеров Windows. Это самая основная часть, и этот вопрос обсуждался на многих веб-сайтах, но моя идея здесь состоит в том, чтобы представить, как я создал пример программы, и показать, как создать простой установщик MSI с необходимыми библиотеками DLL для работы в Windows.
Каждому исполняемому файлу Python требуются библиотеки времени выполнения C ++ для работы в Windows. Вы, должно быть, слышали о нем как о Microsoft Visual C ++ Redistributable или можете найти его как MSVCR. Версия, которая вам понадобится, зависит от того, какую версию Python вы используете.
- Python 2.4 или Python 2.5 - Распространяемый пакет Microsoft Visual C ++ 2005
- Python 2.6, 2.7 или 3.x - Распространяемый пакет Microsoft Visual C ++ 2008
Итак, что мы собираемся делать:
- Наша программа в файлах python
- Напишите установочный файл для исполняемого файла
- Создайте установщик 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
Изначально опубликовано в Фернандо Алвес.