cx_Freeze общая папка lib между исполняемыми файлами - PullRequest
2 голосов
/ 03 мая 2019

Я собираю набор сценариев Python в исполняемые файлы. Я использую cx_Freeze для того, чтобы сделать это.

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

Поскольку я компилирую несколько исполняемых файлов, возможно ли иметь одну общую папку lib, на которую все они ссылаются для уменьшения размера диска?

Пример setup.py выглядит следующим образом:

import sys, os
from cx_Freeze import setup, Executable

base = None
if sys.platform == 'win32':
    base = 'Win32GUI'

executables = [
    Executable('MYSCRIPT.py', base=base)
]

additional_mods = ["numpy.core._methods", "numpy.lib.format"]
exclude_mods = ["babel", "scipy", "PyQt5", "tornado", "zmq", "sphinx", "sphinx_rtd_theme", "psutil", "notebook", "nbconvert", "lxml", "cryptography", "bottleneck", "matplotlib"]

build_exe_options = {"excludes": exclude_mods, "includes": additional_mods, "optimize": 1}

os.environ['TCL_LIBRARY'] = r'C:\ProgramData\Anaconda3\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\ProgramData\Anaconda3\tcl\tk8.6'

setup(name='MYSCRIPT',
      version='0.1',
      includes = ['os'],
      options = {"build_exe": build_exe_options},
      description='MYSCRIPT',
      executables=executables
      )

1 Ответ

1 голос
/ 21 мая 2019

Да, это возможно. Хитрость заключается в том, чтобы использовать один setup.py, где несколько сценариев добавляются в список executables.

Возьмем, к примеру, следующую пару консольных сценариев, которые оба используют numpy:

main1.py

import numpy

print('Program 1, numpy version %s' % numpy.__version__)
input('Press ENTER to quit')

main2.py:

import numpy

print('Program 2, numpy version %s' % numpy.__version__)
input('Press ENTER to quit')

Вы можете сразу же заморозить эти скрипты с помощью cx_Freeze, используя следующее setup.py:

from cx_Freeze import setup, Executable

base = None

executables = [Executable('main1.py', base=base),
               Executable('main2.py', base=base)]

additional_mods = ["numpy.core._methods", "numpy.lib.format"]

build_exe_options = {"includes": additional_mods}

setup(name='MYSCRIPTS',
      version='0.1',
      options={"build_exe": build_exe_options},
      description='MYSCRIPTS',
      executables=executables)

Затем вы получите два исполняемых файла main1.exe и main2.exe, совместно использующих одну и ту же папку lib, содержащую numpy.

...