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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage