Подтвердить что ты не робот

Перемещение всех DLL и PYD в подпапку с помощью cx_Freeze

Это произошло несколько раз в списках рассылки cx_Freeze

(см

cx_Freeze и перемещение файлов вокруг

Создание меньшего количества файлов при замораживании приложения Python

cx_freeze python single file? )

и мне кажется, что это должно быть простым исправлением, но я не вижу, как начать.

У меня есть приложение python, которое зависит от scipy, wxpython, numpy и множества других пакетов, у каждого из которых есть много динамически связанных библиотек. Основная исполняемая папка сильно загромождена файлами PYD и DLL, и даже сложно найти исполняемый файл среди всех файлов. Мои пользователи не особенно разбираются в компьютерах, поэтому ясность очень важна.

Мне не нужен один исполняемый файл, который теоретически может быть сгенерирован bbfreeze. Мне нравится, как файл distutils setup.py работает с cx_Freeze и любым другим способом cx_Freeze довольно блестяще.

Все, что я хочу, это способ очистки основной исполняемой папки. Я был бы полностью доволен перемещением файлов DLL вручную в папку freeze_libs или что-то в этом роде, а затем перемещение пути загрузки разделяемой библиотеки, чтобы помочь найти динамические библиотеки, если это возможно. Или что-то в этом роде.

Спасибо

4b9b3361

Ответ 1

Я понимаю ваше разочарование. То, что я обычно делаю, - это взять всю папку сборки и перенести ее в каталог файлов программ, предполагая, что вы используете машину Windows. Затем создайте ярлык на рабочем столе для исполняемого файла. Затем я обычно меняю значок на что-то приятное для глаз. Другими словами, все системные файлы скрыты, и все, что у вас осталось, - это один красивый значок на рабочем столе.

Ответ 2

"вручную" сделал это, но верно ли это? я на win7 x64 cx_freeze 4.3.2

мой init_script, объединенный с Console.py и ConsoleSetLibPath.py

import encodings
import os
import sys
import warnings
import zipimport

paths = os.environ.get("LD_LIBRARY_PATH", "").split(os.pathsep)
if DIR_NAME not in paths:
    paths.insert(0, DIR_NAME)
    os.environ["LD_LIBRARY_PATH"] = os.pathsep.join(paths)
    os.execv(sys.executable, sys.argv)

sys.frozen = True
sys.path = sys.path[:4]

# i added this line
sys.path.append(r'lib')

os.environ["TCL_LIBRARY"] = os.path.join(DIR_NAME, "tcl")
os.environ["TK_LIBRARY"] = os.path.join(DIR_NAME, "tk")

m = __import__("__main__")
importer = zipimport.zipimporter(INITSCRIPT_ZIP_FILE_NAME)

# The following if/else is copied from ConsoleSetLibPath.py
if INITSCRIPT_ZIP_FILE_NAME != SHARED_ZIP_FILE_NAME:
    moduleName = m.__name__
else:
    name, ext = os.path.splitext(os.path.basename(os.path.normcase(FILE_NAME)))
    moduleName = "%s__main__" % name

code = importer.get_code(moduleName)
exec code in m.__dict__

versionInfo = sys.version_info[:3]
if versionInfo >= (2, 5, 0) and versionInfo <= (2, 6, 4):
    module = sys.modules.get("threading")
    if module is not None:
        module._shutdown()

Затем я сохраняю этот файл в C:\Python27\Lib\site-packages\cx_Freeze\initscripts как ConsoleSetLibPathx.py и в моем setup.py

setup(
    name = 'xxx',
    version = '0.1',
    options = {'build_exe': {'includes':includes,
                             'excludes':excludes,
                             'packages':packages,
                             'include_files':includefiles,
                             'create_shared_zip':True,
                             'include_in_shared_zip':True,
                              # use the "hacked" init_script ?
                             'init_script':'ConsoleSetLibPathx',
                             'include_msvcr':True,
                             }

                             }, 
    executables = [exe]
)

# Am i supposed to do the mkdir lib , and copy *.pyd *.dll into it in the end of this setup.py here? 
# I verified this is working by manually creating lib dir and copy all files inside, it works.

Я чувствую, что должен делать это в настройках или где-то еще, но не совсем понимаю док cx_freeze прямо сейчас. возможно --target-dir или -default-path или -replace-paths? не уверены, как их использовать

edit: извините, это нужно улучшить, когда я тестирую это в другом чистом win7 в vmware, он работает, но он действует странно, мой код неблокирующего считывающего нажатия не работает. не уверены, какая часть является неправильной.