Как обеспечить ealry-привязку с помощью cx_freeze и win32com?
Я сделал несколько скриптов Python для управления внешним приложением CATIA. Теперь мне нужно упаковать эти скрипты в исполняемые файлы, но я не могу это сделать.
Вопрос:
Как заставить win32com использовать раннее связывание для определенных модулей после создания скриптов?
Подробности:
Мои скрипты управляют приложением CATIA с помощью модуля win32com.client. Я работаю с CATIA с поздним связыванием, за исключением модуля CATIA V5 SpaceAnalysisInterfaces Object Library, который содержит функции со ссылочными аргументами ввода / вывода. Для этого я использую раннее связывание, к сожалению, простого использования MakePy не было достаточно, мне пришлось модифицировать сгенерированные источники из пакета win32com.gen_py, чтобы получить правильное поведение из аргументов ввода / вывода. Теперь он отлично работает, когда я выполняю скрипты Python. Но если я собираю их, используя py2exe или cx_freeze, исполняемый файл использует только позднюю привязку, поэтому я получаю плохие результаты.
Вот как я подключаю приложение CATIA и использую его API:
import win32com.client
buff = [0, 0, 0]
catApp = win32com.client.GetActiveObject("CATIA.Application") # Late bind needed
doc = catApp .Documents.Open(path)
part = doc.Part # This property fails if using early binding
spa = doc.GetWorkbench(u"SPAWorkbench")
I = spa.Inertias.Add(part) # Early bind needed
cogCoords = I.GetCOGPosition(buff) # The damn input/ouput argument function
А вот мой скрипт сборки с использованием cx_freeze:
from cx_Freeze import setup, Executable
options = {
"includes": [],
"excludes": [],
"packages": ["win32com.gen_py"]
}
target = Executable(
script = "test.py",
base = "Console",
compress = True,
icon = None,
)
setup(
name = "Test",
version = "1.0",
description = "Early Binding Test Built",
author = "C.LECLERC",
options = {"build_exe": options},
executables = [target]
)
Этот скрипт сборки генерирует кучу файлов, включая содержимое моего фактического модуля win32com.gen_py, поэтому он должен работать. Но когда я выполняю файл, он использует только позднюю привязку. Я не мог проверить, правильно ли добавлены файлы, когда я использую py2exe, но поведение точно такое же: позднее связывание!
Я посмотрел на этот пост, но моя проблема в другом. Модули правильно скопированы, и сценарии не вызывают исключений. Функции ввода / вывода просто не работают правильно.
Любая помощь будет оценена.
1 ответ
Я отвечаю на свой вопрос, чтобы поделиться найденным решением и пометить проблему как решенную.
Решение:
Просто скопируйте файл dicts.dat из пакета win32com.gen_py в эквивалентную папку архива library.zip, созданного с помощью cx_freeze.