【发布时间】:2012-09-26 09:11:04
【问题描述】:
我用 Tkinter 小部件制作了一个 slideshow.py 文件来显示一些照片校正,它可以在我的 windows 和 linux 上完美运行。 为了让它在没有安装python和tcl的windows上运行,我使用py2exe编译成win32可执行文件,setup.py很简单:
from distutils.core import setup
import py2exe
setup(windows=["slideshow.py"])
然后我运行“python setup.py py2exe”,它会在 c:\Users\d2xia\ccm_wa\utils\tfps\ 中生成一个“dist”文件夹,以及“tcl”、“library.zip”、“slideshow. exe”等等。
当我运行 slideshow.exe 时出现错误:
Traceback (most recent call last):
File "slideshow.py", line 45, in <module>
File "Tkinter.pyc", line 1685, in __init__
_tkinter.TclError: Can't find a usable init.tcl in the following directories:
C:/Users/d2xia/ccm_wa/utils/tfps/lib/tcl8.5 C:/Users/d2xia/ccm_wa/utils/tfps/lib/tcl8.5 C:/Users/d2xia/ccm_wa/utils/lib/tcl8.5 C:/Users/d2xia/ccm_wa/utils/tfps/library C:/Users/d2xia/ccm_wa/utils/library C:/Users/d2xia/ccm_wa/utils/tcl8.5.11/library C:/Users/d2xia/ccm_wa/tcl8.5.11/library
tcl8.5 和 tk8.5 实际上位于“tcl”文件夹下,但 py2exe 生成的 exe 似乎仍然在“lib”或“library”下,似乎没有设置正确的 TCL_LIBRARY 和 TK_LIBRARY .
即使我将“tcl”重命名为“lib”,它仍然会出现相同的错误。
set TCL_LIBRARY=c:\Users\d2xia\ccm_wa\utils\tfps\dist\tcl\tcl8.5\
set TK_LIBRARY=c:\Users\d2xia\ccm_wa\utils\tfps\dist\tcl\tk8.5\
然后 slideshow.exe 产生一些新的错误:
c:/Users/d2xia/ccm_wa/utils/tfps/dist/tcl/tcl8.5/init.tcl: version conflict for package "Tcl": have 8.5.11, need exactly 8.5.2
version conflict for package "Tcl": have 8.5.11, need exactly 8.5.2
while executing
"package require -exact Tcl 8.5.2"
(file "c:/Users/d2xia/ccm_wa/utils/tfps/dist/tcl/tcl8.5/init.tcl" line 20)
invoked from within
"source c:/Users/d2xia/ccm_wa/utils/tfps/dist/tcl/tcl8.5/init.tcl"
("uplevel" body line 1)
invoked from within
"uplevel #0 [list source $tclfile]"
我在 C:\apps\git\lib\tcl8.5 中有 Tcl 8.5.11 和 C:\Python27\tcl\tcl8.5 中的 Tcl 8.5.2 好像当我用python运行时,它在python安装路径中寻找tcl,但是py2exe在git安装路径中看起来是不同的副本。
那么问题就变成了: 1. 创建 dist 时如何将正确的 tcl8.5 副本“分配”给 py2exe? 2.如何让生成的可执行文件知道dist中的tcl路径? “tcl”而不是“lib”或“库”
【问题讨论】: