cx-freeze findet nicht alle Abhängigkeiten
Ich habe ein Python-Skript (2.7) mit einigen "interessanten" Importen oben. Ich wollte anfangs py2exe verwenden, um dies in eine exe zu kompilieren, die ich leichter verteilen kann (py2exe findet nicht alle Abhängigkeiten).
Ich habe aufgegeben und versuche stattdessen, cx-freeze zu verwenden. Aber ich habe auch dort ein Problem. Die Probleme scheinen Bibliotheken zu sein, die ich zu Python (jinja2 und restkit) hinzugefügt habe. Ich sehe sie in meinem Python-Verzeichnis ./Lib/site-packages/Jinja2-2.6-py2.7.egg/jinja2 und hier ./Lib/site-packages/restkit-4.2.1-py2.7.egg/restkit.
Hier sind die Importe in meinem Skript:
import datetime
from jinja2 import Environment, PackageLoader
from optparse import OptionParser
from datetime import date, timedelta
from restkit import Resource, BasicAuth, request
Ich benutze eine setup.py mit CX-Freeze. Hier ist die setup.py:
from cx_Freeze import setup, Executable
packages = ["restkit", "jinja2" , "restkit.client" ]
includes = []
includefiles = []
eggsacutibull = Executable(
script = "myScript.py",
initScript = None,
targetName = "myScript.exe",
compress = True,
copyDependentFiles = True,
appendScriptToExe = False,
appendScriptToLibrary = False,
icon = None
)
setup(
name = "myScript",
version = "0.1",
author = 'vickery',
description = "MyScript description",
options = {"build_exe": {"includes":includes, "include_files": includefiles, "packages": packages}},
executables = [eggsacutibull]
)
Ich starte cxfreeze so:
cxfreeze myScript.py --target-dir exe
Ich bekomme das in meinem Build:
Missing modules:
? __pypy__ imported from jinja2.debug
? http_parser.http imported from restkit.client
? jinja2._debugsupport imported from jinja2.debug
? jinja2._markupsafe._speedups imported from jinja2._markupsafe
? jinja2.debugrenderer imported from jinja2.debug
? markupsafe imported from jinja2.utils
? pretty imported from jinja2.utils
? socketpool imported from restkit.conn
Und wenn ich versuche, die exe auszuführen, bekomme ich Folgendes:
Traceback (most recent call last):
File "c:\Python27\lib\site-packages\restkit-4.2.1-py2.7.egg\restkit\__init__.py", line 9, in <module>
from restkit.conn import Connection
File "c:\Python27\lib\site-packages\restkit-4.2.1-py2.7.egg\restkit\conn.py", line 14, in <module>
from socketpool import Connector
ImportError: No module named socketpool
Traceback (most recent call last):
File "c:\Python27\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in <module>
exec code in m.__dict__
File "myScript.py", line 12, in <module>
ImportError: cannot import name Resource
Bearbeiten: Ich lasse jetzt Cxfreeze richtig so laufen:
python setup.py build
Ich habe meinem setup.py auch socketpool hinzugefügt:
packages = [ "restkit", "jinja2" , "restkit.client", "restkit.conn", "socketpool" ]
Aber wenn ich jetzt versuche zu bauen, bekomme ich einen Build-Fehler:
$ python setup.py build
running build
running build_exe
Traceback (most recent call last):
File "setup.py", line 32, in <module>
executables = [eggsacutibull]
File "c:\python27\lib\site-packages\cx_Freeze\dist.py", line 365, in setup
distutils.core.setup(**attrs)
File "c:\python27\lib\distutils\core.py", line 152, in setup
dist.run_commands()
File "c:\python27\lib\distutils\dist.py", line 953, in run_commands
self.run_command(cmd)
File "c:\python27\lib\distutils\dist.py", line 972, in run_command
cmd_obj.run()
File "c:\python27\lib\distutils\command\build.py", line 127, in run
self.run_command(cmd_name)
File "c:\python27\lib\distutils\cmd.py", line 326, in run_command
self.distribution.run_command(command)
File "c:\python27\lib\distutils\dist.py", line 972, in run_command
cmd_obj.run()
File "c:\python27\lib\site-packages\cx_Freeze\dist.py", line 235, in run
freezer.Freeze()
File "c:\python27\lib\site-packages\cx_Freeze\freezer.py", line 570, in Freeze
self.finder = self._GetModuleFinder()
File "c:\python27\lib\site-packages\cx_Freeze\freezer.py", line 325, in _GetModuleFinder
finder.IncludePackage(name)
File "c:\python27\lib\site-packages\cx_Freeze\finder.py", line 534, in IncludePackage
module = self._ImportModule(name, deferredImports)
File "c:\python27\lib\site-packages\cx_Freeze\finder.py", line 274, in _ImportModule
raise ImportError("No module named %r" % name)
ImportError: No module named 'socketpool'
Was mich hier verwirrt hat, ist, dass mein Skript einwandfrei kompiliert wird. Außerdem kann ich diese Module aus einer Python-Shell importieren. Zum Beispiel:
$ python
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import socketpool
>>> from restkit import Resource, BasicAuth, request
>>>
Wie unterscheidet sich die Python-Auflösung von Modulen von der von cxfreeze?
Edit2: Mit Python kann ich Folgendes tun:
>>> import socketpool
>>> print socketpool.__file__
c:\python27\lib\site-packages\socketpool-0.5.2-py2.7.egg\socketpool\__init__.pyc
Ist das ein ungewöhnlicher Ort, um ein Paket zu suchen? Kann ich PYTHONPATH verwenden, um cxfreez dazu zu zwingen, dort nach socketpool zu suchen?
Vielen Dank