我制作了一个slideshow.py文件,用Tkinter小部件显示一些照片修正,它在我的windows和linux上完美运行.为了让它在没有安装python和tcl的Windows上运行,我使用py2exe将其编译成win32可执行文件,setup.py很简单:
from distutils.core import setup
import py2exe
setup(windows=["slideshow.py"])
Run Code Online (Sandbox Code Playgroud)
然后我运行"python setup.py py2exe",它在c:\ Users\d2xia\ccm_wa\utils\tfps \和"tcl","library.zip","slideshow.exe"中生成一个"dist"文件夹,等等.
当我运行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
Run Code Online (Sandbox Code Playgroud)
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\
Run Code Online (Sandbox Code Playgroud)
然后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]"
Run Code Online (Sandbox Code Playgroud)
我在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"或"library"
Tcl版本8.5.11和8.5.2冲突解决了用python安装路径手动替换tcl8.5,tk8.5,tcl85.dll和tk85.dll,我相信它也可以通过改变路径环境变量来解决.但我还是要手动设置TCL_LIBRARY和TK_LIBRARY,我做了一个windows批量包装test.bat:
set TCL_LIBRARY=.\tcl\tcl8.5\
set TK_LIBRARY=.\tcl\tk8.5\
slideshow.exe %1
Run Code Online (Sandbox Code Playgroud)
这有效,有什么更好的想法吗?
归档时间: |
|
查看次数: |
8315 次 |
最近记录: |