python - cx_Freeze-अनावश्यक पैकेजों को रोकना



deployment pyqt (1)

मैंने PyQt4 का उपयोग करते हुए एक छोटे अजगर प्रोग्राम को कोडित किया है। अब, मैं एक स्टैंडअलोन एप्लिकेशन बनाने के लिए cx_Freeze का उपयोग करना चाहता हूं। सब कुछ ठीक काम करता है - cx_Freeze स्वचालित रूप से सभी आवश्यक मॉड्यूल शामिल हैं; जिसके परिणामस्वरूप exe काम करता है

एकमात्र समस्या यह है कि cx_Freeze स्टैंडअलोन में बहुत से अनावश्यक मॉड्यूल पैक करता है हालांकि मैं केवल क्यूटीकोर और क्यूटीगुई का उपयोग करता हूं, यह भी sqlite3, QtNetwork, या QtScript जैसे मॉड्यूल शामिल हैं। हैरानी की बात है, मैं परिणामस्वरूप फ़ोल्डर में भी PyQt5 dlls मिल। मुझे ऐसा लगता है जैसे cx_Freeze मेरे द्वारा स्थापित किए गए सभी PyQt पैकेज का उपयोग करता है। नतीजा एक 200 मेगाबाज़ कार्यक्रम है - यद्यपि मैंने केवल एक छोटी सी स्क्रिप्ट लिखी है।

मैं इस व्यवहार को कैसे रोक सकता हूं?

मैं निम्न setup.py का उपयोग करता हूँ:

import sys
from cx_Freeze import setup, Executable

setup(
    name="MyProgram",
    version="0.1",
    description="MyDescription",
    executables=[Executable("MyProgram.py", base = "Win32GUI")],
)

मैंने कुछ संकुलों को स्पष्ट रूप से शामिल करने की कोशिश की है (हालांकि यह सभी गैरवापर किए गए क्यूटी मॉड्यूल को बाहर करने के लिए काफी गन्दा है) इस कोड को जोड़ना:

build_exe_options = {"excludes": ["tkinter", "PyQt4.sqlite3",
                              "PyQt4.QtOpenGL4", "PyQt4.QtSql"]}

लेकिन ऊपरी मॉड्यूल अभी भी उपयोग किए गए थे। मैंने भी कोशिश की

build_exe_options = {"excludes": ["tkinter", "PyQt4.sqlite3",
                              "QtOpenGL4", "QtSql"]}

उसी परिणाम के साथ

नासमझ क्यूटी प्लेटफार्मों के अतिरिक्त मुझे "छवि प्रारूपों", "टीसीएल", और "टीके" जैसे नाम से भी अनंन्डेड फ़ोल्डर मिलते हैं। स्टैंडअलोन फ़ोल्डर और इंस्टॉलर को यथासंभव छोटे रखने के लिए मैं केवल आवश्यक फ़ाइलों को कैसे शामिल कर सकता हूं?

मैं घंटों के लिए इस समस्या को चला गया लेकिन केवल यह धागा पाया जो मेरी मदद नहीं कर रहा था

मैं विंडोज 8 पर अजगर 3.4.2 एएमडी 64 चला रहा हूँ I

मैं हर समाधान के बारे में खुश हूं जो मुझे एक उचित आकार के साथ वांछित परिणाम "स्वसंपूर्ण" देता है मैंने भी pyqtdeploy की कोशिश की, लेकिन त्रुटि में भाग गया: क्यू टी में अज्ञात मॉड्यूल (लेकिन यह एक अलग सवाल है)।

संपादित करें:

मैं दो मॉड्यूल का उपयोग कर रहा हूँ एक यूआईआईसी द्वारा बनाई गई GUI वर्ग है, "मायप्रोग्रामगुइपसेट" इस फ़ाइल में निम्नलिखित आयात आदेश हैं:

from PyQt4 import QtCore, QtGui
from matplotlibwidget import MatplotlibWidget

मुख्य मॉड्यूल में मैं निम्नलिखित आयात करता हूं:

import MyProgramGUIPreset
import numpy as np
from PyQt4.QtGui import QApplication, QMainWindow, QMessageBox
import sys
from math import *

शायद यह पता लगाना में मदद मिलती है कि समस्या कहां है


"बहिष्कृत" काम नहीं करने का कारण यह था कि मैं सेटअप में बिल्ड विकल्प शामिल करना भूल गया था। कार्यों को छोड़कर कोड में संबंधित रेखा जोड़ने के बाद:

from cx_Freeze import setup, Executable
import sys

# exclude unneeded packages. More could be added. Has to be changed for
# other programs.
build_exe_options = {"excludes": ["tkinter", "PyQt4.QtSql", "sqlite3", 
                                  "scipy.lib.lapack.flapack",
                                  "PyQt4.QtNetwork",
                                  "PyQt4.QtScript",
                                  "numpy.core._dotblas", 
                                  "PyQt5"],
                     "optimize": 2}

# Information about the program and build command. Has to be adjusted for
# other programs
setup(
    name="MyProgram",                           # Name of the program
    version="0.1",                              # Version number
    description="MyDescription",                # Description
    options = {"build_exe": build_exe_options}, # <-- the missing line
    executables=[Executable("MyProgram.py",     # Executable python file
                            base = ("Win32GUI" if sys.platform == "win32" 
                            else None))],
)

इसने कार्यक्रम आकार को 230 एमबी से 120 एमबी तक घटा दिया। फिर भी, मुझे सभी अनावश्यक पैकेजों को छोड़कर एक अच्छा तरीका नहीं मिला। परीक्षण और त्रुटि (निर्माण फ़ोल्डर परीक्षण-पद्धति में सबसे बड़ी फ़ाइलों को हटाने से) मुझे पता चला कि मैं किन कक्षाओं को बाहर कर सकता हूं।

मैंने कोशिश की कि क्या matplotlib बैकेंड समस्या का कारण बनता है और अंत में यह पता लगा कि यह मामला नहीं है। बहरहाल, अगर किसी विशेष नाम योजना के सभी मॉड्यूल को विशेष फ़ोल्डर में छोड़ने के लिए किसी को कोड की आवश्यकता है, तो वह अपनी आवश्यकताओं के अनुसार निम्नलिखित समायोजित कर सकता है:

mplBackendsPath = os.path.join(os.path.split(sys.executable)[0],
                        "Lib/site-packages/matplotlib/backends/backend_*")

fileList = glob.glob(mplBackendsPath)

moduleList = []

for mod in fileList:
    modules = os.path.splitext(os.path.basename(mod))[0]
    if not module == "backend_qt4agg":
        moduleList.append("matplotlib.backends." + modules)

build_exe_options = {"excludes": ["tkinter"] + moduleList, "optimize": 2}

मैं और अधिक सुरुचिपूर्ण समाधानों के बारे में खुश रहूंगा। आगे के विचारों का अभी भी स्वागत है फिर भी, मैं इस समस्या का हल मेरे लिए सुलझ रहा हूं।





cx-freeze