2014-01-26 3 views
7

При использовании py2exe в моей программе Python я получаю исполняемый файл, а также папку tcl\.Использование Numpy создает папку tcl при использовании py2exe

Это странно, потому что я вообще не использую tcl/tk и ничего не связано с tkinter в моем коде.

Почему импорт numpy несет ответственность за добавление этой папки? tcl\? Как предотвратить это?


test.py

import numpy 

print 'hello' 

py2exe КОД

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 импортируется, но не очень полезно. В отчете не указано, что является нарушающим модулем. Тем не менее, это достаточно информации, чтобы исключить Tkinter путем изменения py2exe сценария:

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', вы думаете, что можно избежать' tcl/'при использовании' py2exe'? – Basj

+0

Я не уверен, поскольку я использую 'cx_freeze', а не' py2exe', который не имеет опции «bundle to one exe». Теоретически вы должны иметь возможность упаковывать все файлы, даже '/ tcl', которые нужны директорию' Tkinter' внутри exe. – Fenikso

+1

Для 'py2exe' должна быть опция' bundle_files'. Может быть полезно для этого. – Fenikso

Смежные вопросы