I have a python script (2.7) with some "interesting" imports at the top. I initially wanted to use py2exe to compile this into an exe that I can more easily distribute (py2exe doesn't find all dependencies).
I have given up and am trying to use cx-freeze instead. But, I am having problem there as well. The problems seem to be libraries I have added to Python (jinja2 and restkit). I see them in my python directory ./Lib/site-packages/Jinja2-2.6-py2.7.egg/jinja2 and here ./Lib/site-packages/restkit-4.2.1-py2.7.egg/restkit.
Here are the imports in my script:
import datetime
from jinja2 import Environment, PackageLoader
from optparse import OptionParser
from datetime import date, timedelta
from restkit import Resource, BasicAuth, request
I am using a setup.py with cx-freeze. Here is the 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]
)
I run cxfreeze like this:
cxfreeze myScript.py --target-dir exe
I get this in my 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
And, when I try to run the exe, I get this:
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
Edit: I am now running cxfreeze correctly like this:
python setup.py build
I also added socketpool to my setup.py:
packages = [ "restkit", "jinja2" , "restkit.client", "restkit.conn", "socketpool" ]
But, when I try to build now, I get a build error:
$ 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'
What has me confused here, is, my script compiles just fine. In addition, I can import these modules from a python shell. For example:
$ 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
>>>
How is python resolving modules that is differnt than cxfreeze?
Edit2: From python I can do this:
>>> import socketpool
>>> print socketpool.__file__
c:\python27\lib\site-packages\socketpool-0.5.2-py2.7.egg\socketpool\__init__.pyc
Is that a non-standard place to look for a package? Can I used PYTHONPATH to coerce cxfreez into looking there for socketpool?
Thanks
In case anyone ever runs across this, the problem seemed to be that cxfreeze does not play nicely with eggs. Once I extracted the code out of the egg (renamed it to a zip and unzipped), and, created for example: Python27\Lib\site-packages\socketpool for the code, then ran the build, things seemed to work fine.
Seems like a hack. Time for a shower.