2014-01-26 38 views
7

在我的Python程序中使用py2exe时,我得到一个可执行文件,但也得到一个tcl\文件夹。使用Numpy在使用py2exe时创建一个tcl文件夹

这很奇怪,因为我根本没有使用tcl/tk,在我的代码中没有任何与tkinter相关的东西。

为什么导入numpy负责添加这个tcl\文件夹?如何防止这种情况发生?


test.py

import numpy 

print 'hello' 

PY2EXE CODE

from distutils.core import setup 
import py2exe 

setup(script_args = ['py2exe'], windows=[{'script':'test.py'}], options = {'py2exe': {'compressed':1,'bundle_files': 1}}, zipfile = None) 

回答

11

Modulefinder其用于确定依赖模块被 “混乱” 和叔嗨你需要Tkinter

如果运行下面的脚本...

from modulefinder import ModuleFinder 

finder = ModuleFinder() 
finder.run_script('test.py') 
print finder.report() 

...你会看到发现模块(缩短):

Name      File 
    ----      ---- 
m BaseHTTPServer   C:\Python27\lib\BaseHTTPServer.py 
m ConfigParser    C:\Python27\lib\ConfigParser.py 
m FixTk      C:\Python27\lib\lib-tk\FixTk.py 
m SocketServer    C:\Python27\lib\SocketServer.py 
m StringIO     C:\Python27\lib\StringIO.py 
m Tkconstants    C:\Python27\lib\lib-tk\Tkconstants.py 
m Tkinter     C:\Python27\lib\lib-tk\Tkinter.py 
m UserDict     C:\Python27\lib\UserDict.py 
m _LWPCookieJar    C:\Python27\lib\_LWPCookieJar.py 
... 

所以,现在我们知道,Tkinter是进口的,但它是不是很有用。该报告没有显示什么是违规模块。然而,这是足够的信息通过修改py2exe脚本排除Tkinter

from distutils.core import setup 
import py2exe 

setup(script_args = ['py2exe'], 
     windows=[{'script':'test.py'}], 
     options = {'py2exe': {'compressed':1, 
          'bundle_files': 1, 
          'excludes': ['Tkconstants', 'Tkinter'] 
          }, 
       }, 
     zipfile = None) 

通常是不够的。如果你仍然好奇哪些模块是有问题的,ModuleFinder没什么帮助。但您可以安装modulegraph及其依赖altgraph。然后你可以运行下面的脚本,并将输出重定向到一个HTML文件:

import modulegraph.modulegraph 

m = modulegraph.modulegraph.ModuleGraph() 
m.run_script("test.py") 
m.create_xref() 

您将获得依赖关系图,在那里你会发现:

numpy -> numpy.lib -> numpy.lib.utils -> pydoc -> Tkinter 
+0

谢谢回答。更一般的情况是:即使使用* Tkinter软*,您是否认为在使用'py2exe'时可以避免使用'tcl /'文件夹? – Basj

+0

我不确定,因为我使用'cx_freeze'而不是'py2exe',它没有“绑定到一个exe”选项。理论上你应该能够打包所有的文件,甚至在'exe文件里面'Tkinter'所需的'/ tcl'目录。 – Fenikso

+1

应该有'bundle_files'选项可用于'py2exe'。可能对此有所帮助。 – Fenikso

相关问题