cx-freeze no encuentra todas las dependencias
Tengo una secuencia de comandos de Python (2.7) con algunas importaciones "interesantes" en la parte superior. Inicialmente quería usar py2exe para compilar esto en un archivo ejecutable que puedo distribuir más fácilmente (py2exe no encuentra todas las dependencias).
Me he rendido y estoy tratando de usar cx-freeze en su lugar. Pero, estoy teniendo problemas allí también. Los problemas parecen ser las bibliotecas que he agregado a Python (jinja2 y restkit). Los veo en mi directorio de python ./Lib/site-packages/Jinja2-2.6-py2.7.egg/jinja2 y aquí ./Lib/site-packages/restkit-4.2.1-py2.7.egg/restkit.
Aquí están las importaciones en mi guión:
import datetime
from jinja2 import Environment, PackageLoader
from optparse import OptionParser
from datetime import date, timedelta
from restkit import Resource, BasicAuth, request
Estoy usando un setup.py con cx-freeze. Aquí está el 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]
)
Ejecuto cxfreeze como este:
cxfreeze myScript.py --target-dir exe
Consigo esto en mi compilación:
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
Y, cuando intento ejecutar el exe, obtengo esto:
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
Editar: Ahora estoy ejecutando cxfreeze correctamente de esta manera:
python setup.py build
También agregué socketpool a mi setup.py:
packages = [ "restkit", "jinja2" , "restkit.client", "restkit.conn", "socketpool" ]
Pero, cuando intento compilar ahora, aparece un error de compilación:
$ 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'
Lo que me ha confundido aquí es que mi script compila bien. Además, puedo importar estos módulos desde un shell de python. Por ejemplo:
$ 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
>>>
¿En qué medida Python está resolviendo módulos que son diferentes a cxfreeze?
Edit2: Desde python puedo hacer esto:
>>> import socketpool
>>> print socketpool.__file__
c:\python27\lib\site-packages\socketpool-0.5.2-py2.7.egg\socketpool\__init__.pyc
¿Es ese un lugar no estándar para buscar un paquete? ¿Puedo usar PYTHONPATH para forzar a cxfreez a buscar socketpool?
Gracias