我制作了一些 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 生成的存档。
