Skip to main content
 首页 » 编程设计

python之如何使用 cx_freeze 和 win32com 强制绑定(bind)

2025年05月04日7cmt

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

问题:

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


详情:

我的脚本使用 win32com.client 模块控制 CATIA 应用程序。我使用后期绑定(bind)处理 CATIA,但 CATIA V5 SpaceAnalysisInterfaces Object Library 模块除外,该模块包含具有引用输入/输出参数的函数。对于这个,我使用了早期绑定(bind),遗憾的是,简单地使用 MakePy 是不够的,我必须修改从 win32com.gen_py 包生成的源以获得正确的行为来自输入/输出参数。现在当我执行 python 脚本时它工作正常。但是,如果我使用 py2exe 或 cx_freeze 构建它们,可执行文件仅使用后期绑定(bind),所以我会得到不好的结果。

这是我连接 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 模块的内容,因此它应该可以工作。但是当我执行文件时,它只使用后期绑定(bind)。当我使用 py2exe 时,我无法检查文件是否正确添加,但行为完全相同:late bind !


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

如有任何帮助,我们将不胜感激。

请您参考如下方法:

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

解决方案:

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