Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 31, 2013 22:17:25

Silm
Зарегистрирован: 2013-10-31
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание .exe (py2exe или cxFreeze)

Добрый день.

Есть парсер написаный на python с библиотеками Grab и PyQuery.
Необходимо создать .exe для удобной передачи и простого запуска другими людми. Я скачал и установил py2exe создал файл setup.py с таким содержанием:

from distutils.core import setup
import py2exe
setup(console=['run.py'])

выполнил: python setup.py py2exe

процесс прошел без ошибок, но при попытке запустит run.exe в консоль выводит такую ошибку:

Traceback (most recent call last):
File "run.py", line 12, in <module>
File "grab\spider\__init__.pyc", line 1, in <module>
File "grab\spider\base.pyc", line 18, in <module>
ImportError: No module named dbm

в самом исходном файле библиоткеки есть такая конструкция:
try:
    import anydbm as dbm
except ImportError:
    import dbm

есть подозрение, что надо что то прописать в setup.py, пытался найти что вообще можно прописывать туда, но ничего толком не нашел.

Python 2.7 x32

Отредактировано Silm (Ноя. 1, 2013 08:26:55)

Офлайн

#2 Ноя. 1, 2013 02:33:44

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Создание .exe (py2exe или cxFreeze)

Не мучайте себя. Попробуйте cxFreeze…
Там все интуитивно понятно и есть хороший туториал.

Офлайн

#3 Ноя. 1, 2013 08:26:00

Silm
Зарегистрирован: 2013-10-31
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание .exe (py2exe или cxFreeze)

4kpt_II
Не мучайте себя. Попробуйте cxFreeze…Там все интуитивно понятно и есть хороший туториал.
попробовал cxFreeze. Те же проблемы. При создании билда заметил что cxFreeze выдает такую инфу:

Missing modules:
? BeautifulSoup imported from lxml.html.soupparser
? _dummy_threading imported from dummy_threading
? _emx_link imported from os
? _scproxy imported from urllib
? _sysconfigdata imported from distutils.sysconfig
? ce imported from os
? cssselect imported from pyquery.cssselectpatch
? cssselect.xpath imported from pyquery.cssselectpatch
? dbm imported from grab.spider.base, whichdb
? deliverance imported from pyquery.rules
? deliverance.proxycommand imported from pyquery.rules
? deliverance.pyref imported from pyquery.rules
? django.core.files.base imported from grab.ext.django
? fcntl imported from subprocess
? grp imported from shutil, tarfile
? html.entities imported from grab.tools.html, lxml.html.soupparser
? html5lib imported from lxml.html.html5parser
? html5lib.treebuilders.etree_lxml imported from lxml.html.html5parser
? java.lang imported from xml.sax._exceptions
? jsonpath_rw imported from grab.selector.selector
? netbios imported from uuid
? org.python.core imported from copy, pickle, xml.sax
? os.path imported from grab.ext.ftp, grab.spider.pattern, os, shlex, shutil
? os2 imported from os
? os2emxpath imported from os
? posix imported from os
? pwd imported from getpass, posixpath, shutil, tarfile, webbrowser
? queue imported from grab.spider.base, grab.spider.command_controller
? redis imported from grab.spider.command_controller
? requests imported from pyquery.openers
? restkit imported from pyquery
? restkit.contrib.wsgi_proxy imported from pyquery.ajax
? riscos imported from os
? riscosenviron imported from os
? riscospath imported from os
? rourl2path imported from urllib
? termios imported from getpass
? urllib.error imported from grab.proxylist
? urllib.parse imported from grab.base, grab.ext.django, grab.ext.form, grab.ext.lxml, grab.response, grab.spider.base, grab.tools.files, grab.tools.http, lxml.html, lxml.html.clean, lxml.html.html5parser, pyquery.openers, pyquery.pyquery
? urllib.request imported from grab.proxylist, grab.response, lxml.html, lxml.html.html5parser, pyquery.openers
? webob imported from pyquery, pyquery.ajax
? win32wnet imported from uuid
This is not necessarily a problem - the modules may not be needed on this platform.

То есть он пропускает импорт некоторых модулей, среди них есть и dbm, на отсутствие которого ругается программа при попытки запуска скомпилированного файла.

глядя на ошибку и код
try:
    import anydbm as dbm
except ImportError:
    import dbm
попробовал переименовать в library.zip (архив с библиотеками куда упаковывает всё нужное cxFreeze) файл anydbm.pyc на dbm.pyc и при запуске программа перестала ругаться на отсутствие этой библиотеки (не знаю будет ли оно так работать). Но при этом все равно вылетает ошибка, что не получается найти модуль по имени cssselect, в то же время при компиляции было сообщение что пропущен импорт модуля: cssselect imported from pyquery.cssselectpatch

я попробывал переписать setup.py так:
import sys
from cx_Freeze import setup, Executable
build_exe_options = {"packages": ["cssselect"]}
setup(  name = "pareser",
        version = "0.1",
		options = {"build_exe": build_exe_options},
        executables = [Executable("run.py")])

но в результате получил ошибку при сборке:
  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 575, in Freeze
self.finder = self._GetModuleFinder()
File "C:\Python27\lib\site-packages\cx_Freeze\freezer.py", line 330, in _GetModuleFinder
finder.IncludePackage(name)
File "C:\Python27\lib\site-packages\cx_Freeze\finder.py", line 579, in IncludePackage
module = self._ImportModule(name, deferredImports)
File "C:\Python27\lib\site-packages\cx_Freeze\finder.py", line 288, in _ImportModule
raise ImportError("No module named %r" % name)
ImportError: No module named 'cssselect'

При этом если импортировать cssselect в коде программы, то при ее запуске ошибок не возникает.

Как заставить cxFreeze импортировать то что мне надо?

Отредактировано Silm (Ноя. 1, 2013 08:27:31)

Офлайн

#4 Ноя. 1, 2013 15:13:12

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Создание .exe (py2exe или cxFreeze)

setup.py

import sys
from cx_Freeze import setup, Executable
build_exe_options = {"packages": ["os"], "includes": ["cssselect"]}
base = None
if sys.platform == "win32":
    base = "Win32GUI"
setup( name = "guifoo",
version = "0.1",
description = "My GUI application!",
options = {"build_exe": build_exe_options},
executables = [Executable("C:\Python27\Scripts\script.py", base=base)])
python setup.py build
раз ошибку выдает , значит модуль cssselect , входит в какой либо пакет, который нужно импортировать тоже
просмотри по ошибкам какие модули упоминались и дописывай , pyquery.cssselectpatch
либо найди этот модуль в site-packages и положи в архив с модулями, расширение .pyc , соблюдая путь
либо этот пакет не может импортировать и запихнуть в сборку “C:\Python27\Lib\site-packages\cssselect-0.9.1-py2.7.egg” если это он, то распаковать zip -ом и добавить в архив с модулями папку cssselect
плохо наверное с переименованием dbm.pyc, найдите этот модуль в site-packages и положите в архив

Отредактировано sanodin (Ноя. 2, 2013 06:47:46)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version