Heim > Artikel > Backend-Entwicklung > Ein Tool zum Implementieren von Batch-Packaging-Programmen mit Python~
Kürzlich habe ich einige Artikel über das visuelle Paketierungstool Auto-py-to-exe gelesen, das von einigen großen Leuten gepostet wurde und auf Pyinstaller basiert , aber im Vergleich zu Pyinstaller verfügt es über mehr GUI-Schnittstellen. Ich habe es auch selbst ausprobiert und fand es wirklich nützlich und praktisch. Sie können das Programm mit nur wenigen Klicks packen.
Aber ich habe festgestellt, dass weder Auto-py-to-exe noch pyinstaller mehrere Programme gleichzeitig packen können. Wenn Sie mehrere Programme packen möchten, müssen Sie dies erneut tun, also für einen Programmierer , das ist eine unerträgliche Sache. Auf dieser Grundlage habe ich ein kleines Batch-Paketprogramm geschrieben, das auf Pyinstaller basiert.
Das Pyinstaller-Paketprogramm muss den Befehl cmd verwenden. Hier finden Sie eine kurze Einführung in die gängigen Methoden zum Aufrufen des Befehls cmd.
system() ist eine im OS-Modul integrierte Funktion, die Strings in Befehle umwandeln und im Terminal ausführen kann:
def system(*args, **kwargs): # real signature unknown """ Execute the command in a subshell. """ pass#🎜🎜 #Die Verwendung dieser Methode ist sehr einfach. Sie müssen den auszuführenden Befehl nur als Zeichenfolge in die Funktion einfügen:
import os os.system(f'pyinstaller -F -w D:程序.py')Das cmd-Fenster wird beim Ausführen des Befehls nicht angezeigt wird standardmäßig in der IDE angezeigt und generiert. Die Dateien befinden sich standardmäßig im selben Verzeichnis: os.popen()
def popen(cmd, mode="r", buffering=-1): if not isinstance(cmd, str): raise TypeError("invalid cmd type (%s, expected string)" % type(cmd)) if mode not in ("r", "w"): raise ValueError("invalid mode %r" % mode) if buffering == 0 or buffering is None: raise ValueError("popen() does not support unbuffered streams") import subprocess, io if mode == "r": proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=buffering) return _wrap_close(io.TextIOWrapper(proc.stdout), proc) else: proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, bufsize=buffering) return _wrap_close(io.TextIOWrapper(proc.stdin), proc)
Bei der Verwendung müssen nur die erforderlichen Parameter übergeben und durch Lesen ausgeführt werden oder schreiben: #🎜 🎜#
os.popen(f'pyinstaller -F -w D:程序.py').read()Das Ausführungsergebnis ist das gleiche wie bei os.system() und die generierten Dateien befinden sich im selben Verzeichnis. subprocess.run()Das Subprocess-Modul wird offiziell verwendet, um einige alte Modulmethoden zu ersetzen. Es enthält viele Inhaltsmethoden. popen() ist vollständiger. Das Unterprozessmodul verfügt über mehrere Methoden zum Aufrufen von cmd-Befehlen, nämlich Popen, call, run und getstatusoutput. Hier erklären wir nur kurz die run()-Methode. Die Funktion subprocess.run() führt den angegebenen Befehl aus, wartet auf die Ausführung des Befehls und gibt eine Instanz der CompletedProcess-Klasse zurück, die das Ausführungsergebnis enthält. Die Verwendung ist die gleiche wie bei den Methoden os.system() und os.popen(), wobei der String-Befehl übergeben wird, aber die Auswahl der Parameter ist im Vergleich zu os.system() und os stärker .popen() Viele:
subprocess.run(f'pyinstaller -F -w D:程序.py')Diese Methode gibt standardmäßig keine Ausgabe zurück, sondern nur den Befehl und den Ausführungsstatus. ProgrammimplementierungWir haben bereits gewusst, wie man cmd-Befehle in mehreren Programmen aufruft. Die Verwendungsmethode ist sehr einfach Sie benötigen komplexere Themen, die eingehend untersucht werden können. Die zum Erstellen der GUI verwendete Bibliothek ist PySimpleGUI:
import os import PySimpleGUI as sgWenn sie noch nicht installiert wurde, können Sie sie mit dem Befehl pip installieren:
pip intsall 库名GUI-Schnittstellendesign#🎜 🎜#
Da es keine besonderen Anforderungen an die Funktion gibt, muss sie nur in der Lage sein, mehrere Programme mit nur einem Vorgang zu packen. Der endgültige Designcode lautet wie folgt: #🎜 🎜#
# 主题设置 sg.theme('LightBrown3') # 布局设置 layout = [ [sg.Frame(layout=[ [ sg.InputText(key='please_select_file', size=(24, 1), font=("微软雅黑", 10), enable_events=True), # FileBrowse 只能选择单个文件 FilesBrowse加入s可以选择多个文件 sg.FilesBrowse('获取文件', file_types=(("Text Files", "*.py"),), font=("微软雅黑", 10)), ], ], title='选择文件', title_color='blue', font=("微软雅黑", 10), relief=sg.RELIEF_SUNKEN, )], [sg.Button('开始打包', font=("微软雅黑", 10)), sg.Text('', font=("微软雅黑", 10), size=(16, 0)), sg.Button('退出程序', font=("微软雅黑", 10), button_color='red')]# button_color blue red ] # 创建窗口 window = sg.Window('打包工具', layout, font=("微软雅黑", 12), default_element_size=(30, 1))Die Schnittstelle ist wie folgt: #🎜🎜 # Widget-Schnittstelle Logisches Design
# 🎜🎜#Der über die Schnittstelle erhaltene Dateipfad wird durch ein „;“ getrennt, er muss später aufgeteilt werden:
valuelist = [] # 事件循环 while True: # 退出按钮 event, values = window.read() if event in (None, '退出程序'): break # 打开文件按钮 if event == 'please_select_file': fileName = values['please_select_file'] # 得到的文件路径是以 “;”相分隔的,传入列表 valuelist.append(fileName) if event == '开始打包': if len(valuelist) != 0: # 传入打包函数 pyinstaller_(valuelist) else: sg.popup('文件未选择!')Packfunktion Die Funktion empfängt eine Liste, Der Pfad muss durch eine Schleife gelesen werden. Die Liste muss immer noch durch eine Schleife gelesen werden. Der Effekt der Programmverpackung ist relativ einfach: -F und -w erzeugen jeweils eine einzelne ausführbare Datei und brechen sie ab Anzeige des Befehlszeilenfensters:
def pyinstaller_(valuelist): for i in valuelist: a = i.split(';') for x in a: os.system(f'pyinstaller -F -w {x}')
Ergebnis. exe-Datei
Vor- und Nachteile von Gadgets:# 🎜🎜#
Vorteile: Die Wirkung des Gadgets ist für Menschen mit anderen Bedürfnissen nicht sehr nützlich, aber dennoch nützlich Für Leute, die mehrere Programme verpacken müssen, müssen sie sich schließlich weigern.
Nachteile: Die Mängel des Gadgets liegen auf der Hand. Es kann nicht mit gepackten Programmsymbolen usw. arbeiten, und bei der Ausführung von Befehlen kann es nur einzeln ausgeführt werden, was die Effizienz erheblich verringert und erfordert Koordination von Threads und Prozessen.Zu diesem Zeitpunkt haben wir Python erfolgreich eingesetzt, um die Notwendigkeit der Stapelpaketierung von Programmen zu lösen und unsere Hände frei zu machen.
Das obige ist der detaillierte Inhalt vonEin Tool zum Implementieren von Batch-Packaging-Programmen mit Python~. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!