Форум сайта python.su
Друзья! Я вручную перебирал все модули, но это же несерьёзно!
Итак, имеем экзешник, созданный с помощью 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: Не удаётся найти указанный модуль.
—————————
??
—————————
Отредактировано minin (Сен. 19, 2016 16:00:30)
Офлайн
Попробую внятно изложить своё видение тык скыть проблемы и как я её решил.
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 его нет. Наверное, какая-нибудь программа кинула его туда при установке. Я знаю, что гимп подтягивает за собой свой питон. Может он его туда и закинул.
Офлайн
mininSDL.dll - это графическая библиотека функций (используется для игр, чтобы спрайты рисовать).
На чистой Win XP SP3 32 его нет.
mininТак он установкой не занимается никакой. Просто создаётся пакет, из которого при запуске всё разворачивается в память (что-то на диск, может, кладётся временно), а потом просто туда управление передаётся и работает, пока не выключишь. И так каждый раз.
Предположил, что когда cxfreeze находит файл SDL.dll в системной папке, то просто в целевую папку его не переносит.
Отредактировано py.user.next (Сен. 20, 2016 02:58:48)
Офлайн
py.user.nextЭто я знаю.
Так он установкой не занимается никакой. Просто создаётся пакет, из которого при запуске всё разворачивается в память (что-то на диск, может, кладётся временно), а потом просто туда управление передаётся и работает, пока не выключишь. И так каждый раз.
А dll - это просто файл с функциями скомпилированными, у которого там есть вход (типа для инициализации библиотеки (бывают там ещё состояния переменных)). Когда ты её подключил, у тебя просто стали доступны функции из неё. И дальше у тебя программа пользуется этими функциями, как своими. Плюс от неё в том, что несколько программ могут её подключить к себе одновременно и так расширить свои возможности, а когда не надо, отключить от себя. Таким образом код функций хранится в этой библиотеке, пользоваться ими могут сотни программ, а самих библиотек могут быть тоже сотни.
Отредактировано minin (Сен. 20, 2016 10:59:44)
Офлайн