cx-freeze nie znajduje wszystkich zależności

Mam skrypt Pythona (2.7) z kilkoma „interesującymi” importami na górze. Początkowo chciałem użyć py2exe do skompilowania tego do exe, który mogę łatwiej dystrybuować (py2exe nie znajduje wszystkich zależności).

Zrezygnowałem i zamiast tego próbuję użyć cx-freeze. Ale mam też problem. Problemy wydają się być bibliotekami, które dodałem do Pythona (jinja2 i restkit). Widzę je w moim katalogu Pythona ./Lib/site-packages/Jinja2-2.6-py2.7.egg/jinja2 i tutaj ./Lib/site-packages/restkit-4.2.1-py2.7.egg/restkit.

Oto import w moim skrypcie:

import datetime
from jinja2 import Environment, PackageLoader
from optparse import OptionParser
from datetime import date, timedelta
from restkit import Resource, BasicAuth, request

Używam pliku setup.py z cx-freeze. Oto plik 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]
        )

Używam cxfreeze w ten sposób:

cxfreeze myScript.py --target-dir exe

Dostaję to w mojej kompilacji:

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

A kiedy próbuję uruchomić exe, dostaję to:

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

Edytować: Używam teraz cxfreeze poprawnie tak:

python setup.py build

Do mojego pliku setup.py dodałem także socketpool:

packages = [ "restkit", "jinja2" , "restkit.client", "restkit.conn", "socketpool" ]

Ale kiedy próbuję teraz budować, otrzymuję błąd kompilacji:

$ 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'

To, co mnie myliło, to to, że mój skrypt dobrze się kompiluje. Ponadto mogę importować te moduły z powłoki Pythona. Na przykład:

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

W jaki sposób python rozwiązuje moduły różniące się od cxfreeze?

Edit2: Z Pythona mogę to zrobić:

>>> import socketpool
>>> print socketpool.__file__
c:\python27\lib\site-packages\socketpool-0.5.2-py2.7.egg\socketpool\__init__.pyc

Czy to niestandardowe miejsce do szukania paczki? Czy mogę użyć PYTHONPATH, aby zmusić cxfreez do szukania gniazdka?

Dzięki

questionAnswers(2)

yourAnswerToTheQuestion