Как обеспечить 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.

Другие вопросы по тегам