2014-01-26 11 views
7

Bei Verwendung von py2exe auf meinem Python-Programm erhalte ich eine ausführbare Datei, sondern auch eine tcl\-Ordner.Verwenden von Numpy erstellt einen Tcl-Ordner bei der Verwendung von py2exe

Das ist seltsam, weil ich tcl/tk überhaupt nicht verwende und nichts in Bezug auf tkinter in meinem Code.

Warum importieren numpy ist verantwortlich für das Hinzufügen dieser tcl\ Ordner? Wie kann dies verhindert werden?


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) 

Antwort

11

Modulefinder Modul, welches verwendet wird, um Abhängigkeiten zu bestimmen, wird "verwirrt" und t Winks brauchst du Tkinter.

Wenn Sie folgende Skript ausführen ...

from modulefinder import ModuleFinder 

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

... Sie werden gefunden Module sehen (verkürzt):

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 
... 

So, jetzt wissen wir, dass Tkinter importiert wird, aber es ist nicht sehr nützlich. Der Bericht zeigt nicht, was das beanstandete Modul ist. Allerdings ist es genug Informationen Tkinter durch Modifizieren py2exe Skript auszuschließen:

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) 

Gewöhnlich das ist genug. Wenn Sie immer noch neugierig sind, welche Module die Schuldigen sind, ist ModuleFinder nicht sehr hilfreich. Aber Sie können modulegraph und seine Abhängigkeit altgraph installieren. Dann können Sie das folgende Skript ausführen und die Ausgabe in eine HTML-Datei umleiten:

import modulegraph.modulegraph 

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

Sie Abhängigkeitsdiagramm, wo Sie das finden:

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

Danke für Antwort. Allgemeiner: Denkst du, dass es möglich ist, den 'tcl /' Ordner zu umgehen, wenn du 'py2exe' verwendest? – Basj

+0

Ich bin mir nicht sicher, da ich 'cx_freeze' und nicht' py2exe' verwende, das nicht die Option "bundle to one exe" hat. Theoretisch sollten Sie alle Dateien packen können, sogar '/ tcl' Verzeichnis, das von' Tkinter' in der exe benötigt wird. – Fenikso

+1

Es sollte 'bundle_files' Option für' py2exe' verfügbar sein. Kann dafür hilfreich sein. – Fenikso