Pull to refresh

Облегчаем использование pyinstaller для создания exe

Python *
Недавно начал свое знакомство с языком Python с целью применения его для написания в короткие сроки приложений, выполняющих необходимую задачу здесь и сейчас. Так как планируемые приложения могли быть запущены не только на ос, в которых установлен сам Python, было решено собирать exe. Почитав пару топиков на хабре и комментарии к ним, пришел к выводу, что для этих целей прекрасно подойдет pyinstaller. Он довольно прост в использовании, но все же некоторые повторяющиеся моменты можно сократить.

Для начала опишу используемый для этого софт:
  1. CPython 2.6.5. Спросите почему не 2.7 или 3.x? Описанная ниже версия pywin, используемая для pyinstaller, дружит только с версиями до 2.6 включительно
  2. pyinstaller 1.4 r854 (на момент начала использования это была последняя ревизия)
  3. pywin32-214.win32-py2.6 — последняя доступная на sourceforge версия. Используется pyinstaller для определения зависимостей (вообще им надо сруливать с него, т.к. последнее обновление датируется 09 годом)
  4. UPX 3.0.7 — используем для сжатия файлов


Для того, чтобы произвести сборку exe в соответствии с мануалом необходимо:
  1. Запустить Configure.py, который проверит наличие всех необходимых для сборки компонентов (выполнять при смене конфигураций, будь-то добавление/удаление UPX, изменение библиотек и т.д.)
  2. С помощью MakeSpec.py из папки pyinstaller в соответсвии с необходимыми параметрами создать spec файл
  3. С помощью Build.py из той же папки, указав путь к spec файлу, произвести сборку exe


В связи с тем, что pyinstaller у меня хранится в папке python (путь по умолчанию), а исходники на другом диске, то процедуру шаманства с путями в консоли и постоянным дописыванием одинаковых параметров я решил сократить используя bat файл, разбор которого сейчас и будет произведен.

Для начала, определил цели:
  1. Отвязка от необходимости постоянно задавать путь к MakeSpec и Build файлам, а так же spec файлу
  2. Получение готового exe в той же директории, что и исходный код


Реализация самого bat-файла (комментарии по ходу действия, готовый батник с комментариями лежит ниже):
1. Стандартные для bat строчки — отмена вывода команд в консоль, очистка последней:
@echo off
cls

2. Указываем путь к pyinstaller и путь к папке, в которой будут хранится spec и exe файлы:
set pyinstPath=c:\python26\pyinstaller
set buildPath=%pyinstPath%\bin

3. Задание значений переменной проверки перемещения готового exe и проверки, введено ли имя исходного файла (по сути — флаги):
set moveBin=0
set fileParam=0

4. Начинаем проверку введенных параметров. Для обработки вызываем метку с введеным ключом (3-ая строчка). После обработки каждого параметра возвращаемся на метку :ParamChk. В случае же если параметры закончились, переходим на метку сборки бинарника (2-ая строчка):
:ParamChk
if "%1%"=="" goto binBuild
goto p%1

5. Собственно сами метки ключей/параметров. Вариации ввода разнообразные, суть одна и та же — в случае, если такой ключ существует, производим необходимые манипуляции, такие как получение имени исходного файла, пути по которому будет хранится spec файл, вывод помощи и с помощью команды shift производится сдвиг параметров на 1 влево (был параметр %2, стал %1 и т.д.):
:p-F
:p/F
:p/file
:p--file
if not "%2"=="" (
set pyFile=%2
if not %fileParam%==1 set fileParam=1
)
shift & shift & goto ParamChk
 
:p-O
:p/O
:p/out
:p--out
if not "%2"=="" set buildPath=%2
shift & shift & goto ParamChk
 
:p-M
:p/M
:p/move
:p--move
set moveBin=1
shift & goto ParamChk
 
:p-H
:p/H
:p/help
:p--help
echo.
echo Use: %~n0 [/F [path]filename] [/O dir] [/M]
echo.
echo /F, -F, /file, --file - Path to .py file 
echo /O, -O, /out, --out - Output directory. Default directory - %buildPath%
echo /M, -M, /move, --move - Move created binary to .py file directory
goto :EOF

6. После проверки и обработки всех параметров переходим к метке :binBuild и проверяем, было ли введено имя исходного файла. В случае если нет — выводим сообщение о необходимости наличия имени файла, наличии справки и завершаем работу:
:binBuild
if %fileParam%==0 echo No file to work with. Use /for help & goto :EOF

7. Задаем параметры, в соответствии с которыми будет производится сборка exe. Синтаксис берем в мануале к pyinstaller. В данном случае указаны следующие параметры — сборка в один файл, сжатие с помощью UPX + смена папки для готового exe:
set specParams=---%buildPath%

8. Далее производим создание spec файла и создание exe на его основе, используя заданные выше пути к MakeSpec, Build и параметры для первого. Присутствует один жуткий костыль — учитывая, что я не спец по batch файлам, то способ выделить из пути к исходному файлу только его имя я нашел только с помощью цикла (2-ая строчка):
"%pyinstPath%\MakeSpec.py" %specParams% "%pyFile%"
for %%in (%pyFile%) do (set fileName=%%~ni)
%pyinstPath%\Build.py "%buildPath%\%fileName%.spec"

9. В случае если был задан параметр на перемещение бинарника в папку с исходным кодом, для ее получения используем костыль из пункта 8-м. А затем просто перемещаем файл с заменой без подтверждения:
if %moveBin%==1 (
for %%in (%pyFile%) do (set outDir=%%~pi)
move /"%buildPath%\dist\%fileName%.exe" %outDir%
)


Готовый bat файл с комментариями лежит тут.
Для использования достаточно отредактировать строки по пунктам 2 и 7 в соответствии с вашим расположением папки pyinstaller и требуемым параметрам.

Disclaimer:
Вот и все. Хотелось бы отметить, что в комментариях как здесь, так и в самом bat файле я не описывал особенности синтаксиса команд, а просто описал последовательность выполненных действий. Для справки по команде в консоли достаточно выполнить <имя_команды> /? и вам напишут больше, чем я могу тут описать и знаю. Если вы знаете, как избавится от некоторых костылей или облегчить/упростить выполнение некоторых пунктов, с радостью выслушаю. Если вы считаете, что данный топик не должен находится в блоге Python, а в каком-то другом, просьба указать в каком именно.
Tags:
Hubs:
Total votes 36: ↑35 and ↓1 +34
Views 45K
Comments 16
Comments Comments 16