cx_freeze从错误的位置复制dll

时间:2012-06-21 19:12:36

标签: python python-3.x cx-freeze

我正在使用cx_freeze为64位Windows下的python 3.2 x86的简单PyQt应用程序生成一个exe。

问题在于虽然cx_freeze完全复制了所有依赖项,但由于某些奇怪的原因,它不使用我的python安装中的QtCore4.dll,而是执行以下操作:

copying D:\Python\Python 3.2 x86\lib\site-packages\PyQt4\QtCore.pyd -> build\exe.win32-3.2\PyQt4.QtCore.pyd
copying C:\Program Files\MiKTeX 2.9\miktex\bin\x64\QtCore4.dll (!!) -> build\exe.win32-3.2\QtCore4.dll

现在,如果我正在创建64位版本(虽然仍然不完美),这不是什么大问题,但显然64位dll对我的32位exe不起作用。那么如何让cx_freeze停止查看dll的系统路径,而是让它在sys.path或我控制中的其他路径中搜索?

我尝试将path选项明确设置为sys.path,但无济于事。

1 个答案:

答案 0 :(得分:2)

根据提供的数据,您至少可以看到3个选项:

1)您可以将bin-path-excludes选项添加到build_exe文件中,其中包含您希望从流程中排除的路径。具体到你的例子:

bin-path-excludes: ["C:\Program Files\MiKTeX 2.9\miktex\bin\x64",] ,

2)永久重新排列PATH,以便miktex条目晚于你想要使用的QtCore4.dll导入。(这可能会导致它无法成为可行的选项)

3)在批处理(或shell)脚本中包含对cx_freeze的调用,并在调用cx_freeze脚本之前操作脚本中的PATH。

我在网络上找不到这种情况的任何示例,因此我的研究基于阅读cx_freeze源代码。很可能是一种更优雅的技术,但是从文档和源代码中都看不出来。