2015-07-15 2 views
2

Я развертываю приложение cherrypy, упаковывая в набор исполняемых файлов с помощью cx_freeze.Cherrypy не может найти модуль wsgiserver при упаковке cxfreeze

Я использую python 3 (через scl в CentOS). Чтобы скомпилировать исполняемые файлы, я запускаю:

scl enable python33 -- cxfreeze server.py 

где server.py - это сценарий ввода.

Когда я исполняю полученный файл, сервер запускается и сразу останавливается с ошибкой: выход сценария

Traceback (most recent call last): 
    File "/opt/rh/python33/root/usr/lib/python3.3/site-packages/cherrypy/process/wspbus.py", line 205, in publish 
    output.append(listener(*args, **kwargs)) 
    File "/opt/rh/python33/root/usr/lib/python3.3/site-packages/cherrypy/_cpserver.py", line 167, in start 
    self.httpserver, self.bind_addr = self.httpserver_from_self() 
    File "/opt/rh/python33/root/usr/lib/python3.3/site-packages/cherrypy/_cpserver.py", line 157, in httpserver_from_self 
    from cherrypy import _cpwsgi_server 
    File "/opt/rh/python33/root/usr/lib64/python3.3/importlib/_bootstrap.py", line 1616, in _handle_fromlist 
    _call_with_frames_removed(import_, from_name) 
    File "/opt/rh/python33/root/usr/lib64/python3.3/importlib/_bootstrap.py", line 313, in _call_with_frames_removed 
    return f(*args, **kwds) 
    File "/opt/rh/python33/root/usr/lib64/python3.3/importlib/_bootstrap.py", line 1567, in _find_and_load 
    return _find_and_load_unlocked(name, import_) 
    File "/opt/rh/python33/root/usr/lib64/python3.3/importlib/_bootstrap.py", line 1534, in _find_and_load_unlocked 
    loader.load_module(name) 
    File "/opt/rh/python33/root/usr/lib/python3.3/site-packages/cherrypy/_cpwsgi_server.py", line 7, in <module> 
    from cherrypy import wsgiserver 
    File "/opt/rh/python33/root/usr/lib64/python3.3/importlib/_bootstrap.py", line 1616, in _handle_fromlist 
    _call_with_frames_removed(import_, from_name) 
    File "/opt/rh/python33/root/usr/lib64/python3.3/importlib/_bootstrap.py", line 313, in _call_with_frames_removed 
    return f(*args, **kwds) 
    File "/opt/rh/python33/root/usr/lib64/python3.3/importlib/_bootstrap.py", line 1567, in _find_and_load 
    return _find_and_load_unlocked(name, import_) 
    File "/opt/rh/python33/root/usr/lib64/python3.3/importlib/_bootstrap.py", line 1534, in _find_and_load_unlocked 
    loader.load_module(name) 
    File "/opt/rh/python33/root/usr/lib/python3.3/site-packages/cherrypy/wsgiserver/__init__.py", line 14, in <module> 
    exec('from .wsgiserver3 import *') 
    File "<string>", line 1, in <module> 
    File "/opt/rh/python33/root/usr/lib64/python3.3/importlib/_bootstrap.py", line 1567, in _find_and_load 
    return _find_and_load_unlocked(name, import_) 
    File "/opt/rh/python33/root/usr/lib64/python3.3/importlib/_bootstrap.py", line 1531, in _find_and_load_unlocked 
    raise exc 
ImportError: No module named 'cherrypy.wsgiserver.wsgiserver3' 

cxfreeze содержит, среди остальных, эта линия:

Missing modules: 
[...] 
? wsgiserver2 imported from cherrypy.wsgiserver 
[...] 
This is not necessarily a problem - the modules may not be needed on this platform. 

В/опт/отн/python33/корень/USR/Библиотека/python3.3/сайт-пакеты/CherryPy/wsgiserver/__ init__.py Я вижу:

import sys 
if sys.version_info < (3, 0): 
    from wsgiserver2 import * 
else: 
    # Le sigh. Boo for backward-incompatible syntax. 
    exec('from .wsgiserver3 import *') 

Интересно, почему wsgiserver импортирован неправильно.

Я также попытался включить wsgiserver3 модуль явно в setup.py:

buildOptions = { 
    'packages' : ['cherrypy'], 
    'includes' : ['cherrypy.wsgiserver.wsgiserver3'], 
    'excludes' : [], 
    'path' : sys.path, 
} 

import sys 
base = 'Win32Service' if sys.platform=='win32' else None 

executables = [ 
    Executable('server.py', base=base, targetName = 'myapp') 
] 

setup(name='Myapp', 
     version = '1.0beta1', 
     description = 'My App', 
     options = dict(build_exe = buildOptions), 
     executables = executables) 

Любые намеки?

Спасибо,

г

ответ

4

Вопрос включен ответ. cxfreeze должен делать какой-то анализ зависимости. Я не знаю точно, что такое метод, это может быть обход AST, например, но то, что он делает, ищет import s. Когда библиотека выполняет динамический импорт, например exec('from .wsgiserver3 import *')cxfreeze не узнает его. Таким образом, вам необходимо точно указать такие модули в конфигурации cxfreeze. Я вижу вариант настройки конфигурации --include-modules.

Кстати, по той же причине динамического импорта CherryPy 3.5 (насколько я помню) распределение колес не имело такого же модуля wsgiserver3.

Update

Вот цитата из раздела документации distutils commands:

To specify options in the script, use underscores in the name. For example:

setup(options = {'build_exe': {'init_script':'Console'}}) 

To specify the same options on the command line, use dashes, like this:

python setup.py build_exe --init-script Console 

Update 2

Хорошо, я пип-установлен cx_freeze (не так быстро, только с помощью this comment) и сделал тест сам.

app.py

#!/usr/bin/env python3 


import cherrypy 


class App: 

    @cherrypy.expose 
    def index(self): 
    return 'Hello world!' 


if __name__ == '__main__': 
    cherrypy.quickstart(App(), '/') 

установки.ру

import sys 

from cx_Freeze import setup, Executable 


options = { 
    'build_exe' : { 
    'includes' : 'cherrypy.wsgiserver.wsgiserver3' 
    } 
} 
executables = [Executable('app.py')] 

setup(
    name  = 'CherryPyApp', 
    version  = '0.1', 
    description = 'Testing CherryPy wsgiserver3 dynamic import', 
    options  = options, 
    executables = executables 
) 

Это делает работу с {'includes': 'cherrypy.wsgiserver.wsgiserver3'}, не без этого, ImportError("No module named 'cherrypy.wsgiserver.wsgiserver3'",).

+0

Спасибо. Он работает, если я добавлю параметр командной строки '--include-modules = cherrypy.wsgiserver.wsgiserver3', но не добавляю модуль в список' includes' в setup.py (см. Конфигурационный файл, который я просто добавляю к своему сообщению). Как добавить этот параметр в мой файл конфигурации? –

+1

@gattumarrudu Посмотрите. – saaj

+0

Я пробовал точно то же самое безрезультатно. Я был удивлен, что это не задокументировано, и поэтому я догадался, что 'includes', который документирован и описан так же, как опция командной строки' include-modules', будет иметь тот же эффект. –

Смежные вопросы