Я пытаюсь получить выходные данные git describe
, оцененные на этапе анализа PyInstaller, и сделать их доступными для переменной времени выполнения Python, чтобы предоставить приложению строку ревизии, полученную из среды сборки и отображаемую во время выполнения.
Для этого я предполагаю, что хуки PyInstaller - лучшее средство, потому что они позволяют выполнять произвольный код Python в файле хуков, пока он строит дерево импорта.Однако я не нашел способа передать значение переменной из фазы анализа PyInstaller в переменную времени выполнения, чтобы оно могло отображаться приложением, работающим как сгенерированный файл .exe
.
Пример: файл подключенияhook-rev.py
, который импортируется механизмом анализа PyInstaller при обнаружении import rev
:
import git
rev = git.Repo().git.describe()
print('got rev = {}'.format(rev))
mymodule.py
содержит:
import rev
rev.py
содержит:
global AppRev
try:
# Get the revision from the hook file
AppRev = rev
except:
print('rev is not defined')
Запуск PyInstaller как:
pyinstaller --additional-hooks-dir=. mymodule.py
подтверждает, что импорт файла подключения запускается на этапе анализа PyInstaller, а оператор печати показывает, что переменной rev
присвоен правильный результат git describe
в области файла подключения, пока PyInstaller создает дерево импорта.Но сгенерированный файл .exe
выдает:
rev is not defined
Конечно, это верно с учетом примеров кода, потому что rev
не находится в локальном или другом доступном пространстве имен.Я не знаю, что такое пространство имен файла ловушек, и, следовательно, переменная rev
.
Добавив этот оператор печати
print('module name = {}'.format(__name__))
в файл ловушек hook-rev.py
Я вижу, что механизм импорта ловушек PyInstaller назначает имя __PyInstaller_hooks_0_rev
импортированному подключаемому модулю.Но этот импорт существует только во время сборки, поэтому попытка доступа к переменной rev
во время выполнения в run.py
, так как __PyInstaller_hooks_0_rev.rev
завершается неудачей, так как модуль __PyInstaller_hooks_0_rev
неизвестен во время выполнения.
Есть ли другойспособ соединить пространства имен между средой выполнения и обработкой импорта хуков PyInstaller?