Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 19, 2016 15:59:42

minin
Зарегистрирован: 2016-08-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

cx_Freeze: Как узнать, какого именно модуля не хватает на целевой машине?

Друзья! Я вручную перебирал все модули, но это же несерьёзно!

Итак, имеем экзешник, созданный с помощью cx_Freeze (Windows XP); на Windows 7 выкатывается такой шар (окошко MessageBox):

—————————
cx_Freeze: Python error in main script
—————————
Traceback (most recent call last):
File “E:\Python31\lib\site-packages\cx_Freeze\initscripts\Console3.py”, line 27, in <module>
File “test.py”, line 1, in <module>
File “E:\Python31\lib\site-packages\pygame\__init__.py”, line 95, in <module>
File “ExtensionLoader_pygame_base.py”, line 12, in <module>
ImportError: DLL load failed: Не удаётся найти указанный модуль.

—————————
??
—————————

КАКОЙ МОДУЛЬ?

Я нашёл вручную, каких модулей не достаёт (msvcr90.dll, comctl32.dll, SDL.dll). То есть запускал экзешник на XP, получал список загруженных dll-к, трёх из них не было на Windows 7, но я же вручную весь поиск производил. Это список модулей получи, да потом ещё каждый модуль найди на Windows 7. В общем, есть ли какой-нибудь способ СРАЗУ получить список нужных модулей? Обращаю внимание, что программа простая, графическирй “HelloWord”, то есть в процессе работы никаких dll-ок не подгружается, явно по крайней мере. Простой цикл обработки сообщений, обрабатывающий одно сообщение и всё. Спасибо, кто отклинется.



Отредактировано minin (Сен. 19, 2016 16:00:30)

Офлайн

#2 Сен. 19, 2016 20:14:24

minin
Зарегистрирован: 2016-08-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

cx_Freeze: Как узнать, какого именно модуля не хватает на целевой машине?

Попробую внятно изложить своё видение тык скыть проблемы и как я её решил.

1) Помним про пакет Microsoft Visual C++ Redistributable Package; не забывают о нём и создатели cxfreeze, тут про него написано

2) По кропанию экзешника с помощью cxfreeze создаётся целевая папка, куда cxfreeze кладёт всякие разные файлы. Среди них файл SDL.dll, который в моём случае был необходим для работы и почему-то НЕ БЫЛ ПОМЕЩЁН в целевую папку, рядом с экзешником. Пришлось мне его вручную на целевую машину перетаскивать и тогда всё заработало. К слову, файд SDL.dll на исходной машине спокойно лежит в папке E:\Python31\Lib\site-packages\pygame; но, как я уже сказал, в целевую папку НЕ ПЕРЕНОСИТСЯ. А ведь он нужен на целевой машине! Почему так? Попробуем разобраться.

3) Я нашёл файл SDL.dll на исходной машине ещё в одном месте - в папке C:\Windows\system32. То есть на исходной машине файл SDL.dll находится в ДВУХ МЕСТАХ: в папке C:\Windows\system32 и в папке E:\Python31\Lib\site-packages\pygame; запомним этот факт

4) Предположил, что когда cxfreeze находит файл SDL.dll в системной папке, то просто в целевую папку его не переносит. Вот так вот бесхитростно, cxfreeze, наверное, думает, что раз он есть на исходной машине в системной папке, то он и на целевой машине тоже будет в системной папке

5) Мои предположения оказались верны. Несколько экспериментов с чистой осью это подтвердили. Вот так вот, cxfreeze имеет в своём арсенале кучу разных файлов, которыми может оперировать. В данном случе просто перенести их в целевую папку и положить рядом м экзешником. Но будте готовы к тому, что если в системной папке найдётся файл с таким же именем, то он в целевую папку НЕ ПЕРЕНЕСЁТСЯ. (Это нужно исправить, я бы сам поковырялся, но я не настолько зная питон.) И если на целевой машине его нет, то там экзешник не заработает. А самое главное, имя недостающего файла не выведется. Кстати, как его получить быстро, а не так как я - этот вопрос открыт

6) Последнее- откуда в системной папке взялся файл SDL.dll (к слову, он отличается от cxfreeze-го SDL.dll)? Этого я не знаю, но точно знаю, что он неродной. На чистой Win XP SP3 32 его нет. Наверное, какая-нибудь программа кинула его туда при установке. Я знаю, что гимп подтягивает за собой свой питон. Может он его туда и закинул.


Офлайн

#3 Сен. 20, 2016 02:51:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9891
Репутация: +  854  -
Профиль   Отправить e-mail  

cx_Freeze: Как узнать, какого именно модуля не хватает на целевой машине?

minin
На чистой Win XP SP3 32 его нет.
SDL.dll - это графическая библиотека функций (используется для игр, чтобы спрайты рисовать).

minin
Предположил, что когда cxfreeze находит файл SDL.dll в системной папке, то просто в целевую папку его не переносит.
Так он установкой не занимается никакой. Просто создаётся пакет, из которого при запуске всё разворачивается в память (что-то на диск, может, кладётся временно), а потом просто туда управление передаётся и работает, пока не выключишь. И так каждый раз.

А dll - это просто файл с функциями скомпилированными, у которого там есть вход (типа для инициализации библиотеки (бывают там ещё состояния переменных)). Когда ты её подключил, у тебя просто стали доступны функции из неё. И дальше у тебя программа пользуется этими функциями, как своими. Плюс от неё в том, что несколько программ могут её подключить к себе одновременно и так расширить свои возможности, а когда не надо, отключить от себя. Таким образом код функций хранится в этой библиотеке, пользоваться ими могут сотни программ, а самих библиотек могут быть тоже сотни.



Отредактировано py.user.next (Сен. 20, 2016 02:58:48)

Офлайн

#4 Сен. 20, 2016 10:20:55

minin
Зарегистрирован: 2016-08-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

cx_Freeze: Как узнать, какого именно модуля не хватает на целевой машине?

py.user.next
Так он установкой не занимается никакой. Просто создаётся пакет, из которого при запуске всё разворачивается в память (что-то на диск, может, кладётся временно), а потом просто туда управление передаётся и работает, пока не выключишь. И так каждый раз.

А dll - это просто файл с функциями скомпилированными, у которого там есть вход (типа для инициализации библиотеки (бывают там ещё состояния переменных)). Когда ты её подключил, у тебя просто стали доступны функции из неё. И дальше у тебя программа пользуется этими функциями, как своими. Плюс от неё в том, что несколько программ могут её подключить к себе одновременно и так расширить свои возможности, а когда не надо, отключить от себя. Таким образом код функций хранится в этой библиотеке, пользоваться ими могут сотни программ, а самих библиотек могут быть тоже сотни.
Это я знаю.
Я что имел ввиду. cxfreeze оперирует файлами *.dll, которые находятся где-нибудь. В том числе они находятся у меня на машине в папке E:\Python31\Lib\site-packages\pygame. Итак, cxfreeze запущен и в числе прочего он делает:

E:\Python31\Lib\site-packages\pygame\SDL_image.dll переносит в целевую папку
E:\Python31\Lib\site-packages\pygame\SDL_mixer.dll переносит в целевую папку
E:\Python31\Lib\site-packages\pygame\SDL_ttf.dll переносит в целевую папку
E:\Python31\Lib\site-packages\pygame\SDL.dll НЕ переносит в целевую папку

Почему не переносит? Начал разбираться и методом научного тыка установил, что на момент переноса ещё один файл SDL.dll находился в системной папке C:\Windows\system32. Это причина непереноса. Кто может объяснить лучше, пусь объяснит лучше.

Правильно-то, конечно, смотреть код, как работает cxfreeze, но я не настолько хорошо знаю питон. Но всё равно мой вывод нужно принять к сведению, может поможет кому-нибудь. И да, вчера не стал уж писать- я разобрался, как SDL.dll оказался у меня в системной папке; я его сам полтора года назад туда закинул, когда эксперементировал с графикой на плюсах. (качнул SDL с хидерами, *.a, и SDL.dll, разбросал всё это по раным папкам и забыл. Благо я записываю подобные действия.)

Не, но самое-то главное- как же узнать, какой именно модуль не может найтись cxfreeze-м? Может, есть како-нибудь способ, кроме топороного перебирания всех модулей, загруженных в рабочее пространство работоспособного экзешника?

Отредактировано minin (Сен. 20, 2016 10:59:44)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version