如何使用cx_freeze和win32com强制执行ealry绑定?

时间:2013-11-28 17:15:31

标签: python win32com cx-freeze late-binding early-binding

我制作了一些python脚本来控制外部CATIA应用程序。我现在必须将这些脚本打包成可执行文件,但我无法做到。

问题:

如何在构建脚本后强制win32com对特定模块使用早期绑定?


详情:

我的脚本使用 win32com.client 模块控制CATIA应用程序。我使用后期绑定处理CATIA,但模块 CATIA V5 SpaceAnalysisInterfaces对象库包含带有引用输入/输出参数的函数。对于这个我使用早期绑定,遗憾的是没有使用 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 时,我无法检查文件是否正确添加但行为完全相同:后期绑定!


我看了this post,但我的问题不同了。模块被正确复制,脚本不会引发异常。输入/输出功能无法正常工作。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我回答我自己的问题,分享我找到的解决方案并将问题标记为已解决。

解决方案:

只需将'dicts.dat'文件从 win32com.gen_py 包中复制到'library.zip'的等效文件夹中由cx_freeze生成的存档。