Уведомления

Группа в Telegram: @pythonsu

#1 Май 30, 2013 22:01:19

evgen34
Зарегистрирован: 2013-03-26
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

cx_Freeze и загрузка модулей из zip

Всем привет. Никак не находятся решения на 2 вопроса. Занимаюсь сборкой проекта на винде на cpython-е 3.3 в самостоятельно (без питона на компе) исполняемую ерунду с помощью cx_Freeze. Со всеми опциями, из руководства на офф-сайте разобрался, прога работает, но хочется лучше:
1) в папке с программой получается много файлов. Предполагаю, что python33.dll, tcl85.dll, tk85.dll спрятать никуда не получится, все таки важные библиотеки, эти можно потерпеть. Кроме этого в корне у меня лежат несколько модулей, написанных на c, вот об них я споткнулся: обычные питоновские модули без проблем прячутся в сам exe-шник, а эти чем хуже? Также через import подключаю. Как их убрать, хотябы в один zip? Пробовал в setup-е прописывать, вроде

zip_includes = [('C:\project\_timex.pyd','_timex.pyd')]
а толку никакого, в zip-е лежат, но не подхватываются. Если возможно их спрятать, может и _tkinter.pyd и другие pyd-ы убрать получится?
2) а второй вопрос такой: возможно ли импортировать модули не с файловой системы, а из переменной, например, как объект bytes из памяти? Мне интересен не схожий эффект, а чтобы эти модули вели себя как модули при обычном импорте. Возможно ли это?
Спасибо

Офлайн

#2 Май 31, 2013 06:26:11

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

cx_Freeze и загрузка модулей из zip

pyinstaller вроде все в один файл запихивает

по идее все используемые модули можно вписать как функции или классы в код программы ,получится прожка на мнооого строк кода

Офлайн

#3 Май 31, 2013 09:35:50

evgen34
Зарегистрирован: 2013-03-26
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

cx_Freeze и загрузка модулей из zip

Про pyinstaller на оффициальном сайте написано:

Multiversion: works under any version of Python from 2.3 up to 2.7.
А мне нравится на 3-м писать, переделывать под 2-й не хочу.
В один модуль собрать можно, конечно, но это не выход - придется еще кучу времени тратить на то, что должно это время экономить - тоже не вариант. Мне хотя бы разобраться со вторым вопросом.

Офлайн

#4 Май 31, 2013 22:27:04

evgen34
Зарегистрирован: 2013-03-26
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

cx_Freeze и загрузка модулей из zip

Видимо опытные питонщики в основном на 2-м пока сидят

Офлайн

#5 Июнь 1, 2013 06:46:36

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

cx_Freeze и загрузка модулей из zip

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

Офлайн

#6 Июнь 1, 2013 08:17:19

evgen34
Зарегистрирован: 2013-03-26
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

cx_Freeze и загрузка модулей из zip

Программы так и выглядят обычно, с компактностью можно смириться. Мне больше интересен второй вопрос: возможно ли импортировать модули не с файловой системы, а из переменной, например, как объект bytes из памяти? Неужели никто не сталкивался с подобной необходимостью?

Офлайн

#7 Июнь 1, 2013 09:16:41

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

cx_Freeze и загрузка модулей из zip

Если я правильно понял,то
допустим берете модуль os ,копируете его содержимое в ваш код и без всякого импорта пользуетесь

import sys, errno
_names = sys.builtin_module_names
# Note:  more names are added to __all__ later.
__all__ = ["altsep", "curdir", "pardir", "sep", "extsep", "pathsep", "linesep",
           "defpath", "name", "path", "devnull",
           "SEEK_SET", "SEEK_CUR", "SEEK_END"]
def _get_exports_list(module):
    try:
        return list(module.__all__)
    except AttributeError:
        return [n for n in dir(module) if n[0] != '_']
.....
def walk(top, topdown=True, onerror=None, followlinks=False):
    ......
#здесь ваш код но уже не os.walk
for i,r,t in walk('.'):
    print i
,но модуль os так же импортирует модули sys , errno и еще кучу других, их тоже тогда так же надо вносить в ваш код

или я не о том?

Отредактировано sanodin (Июнь 1, 2013 09:36:50)

Офлайн

#8 Июнь 3, 2013 15:13:32

evgen34
Зарегистрирован: 2013-03-26
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

cx_Freeze и загрузка модулей из zip

sanodin, спасибо, но в принципе это то же, что ты предложил в первом посту - собрать все модули в один скрипт. Для скриптов на питоне - это какое-то решение, но если мой модуль написан на си, то его никак не добавить в скрипт. По загрузке модулей из zip в нете ничего не нашел. Хотя, cx_Freeze часть модулей добавляет в library.zip и они прекрасно от туда подгружаются и работают, а значит впринципе это возможно, только кто знает молчит об этом

Офлайн

#9 Июнь 3, 2013 16:37:20

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

cx_Freeze и загрузка модулей из zip

из корня проекта тоже не подхватывает(сишные)? не из архива

в архиве сишные наверное не подхватит,по крайней мере здесь http://python.su/forum/topic/6402/lofi/ так говорят

ну и эту тему посмотрите http://habrahabr.ru/post/149621/

Отредактировано sanodin (Июнь 3, 2013 16:52:03)

Офлайн

#10 Июнь 4, 2013 16:38:36

evgen34
Зарегистрирован: 2013-03-26
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

cx_Freeze и загрузка модулей из zip

sanodin, спасиба! IronPython - это действительно выход. Все равно я пишу на винде и для винды, а там .net на любом корыте стоит изначально. И для некоторых решений стандартную библиотеку не тянет, так что буду пробовать эту штуку. Хотя он пока совместим с 2.7 питоном, но готовится переход на третий, чему я рад. Что касается http://py2exe.svn.sourceforge.net/viewvc/py2exe/trunk/py2exe/zipextimporter.py?view=markup, то это все же громоздкое решение.
Можно считать вопрос решеным, буду пробовать .NET

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version