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