최근에 일부 전문가가 게시한 시각적 패키징 도구인 auto-py-to-exe에 대한 기사를 읽었습니다. Auto-py-to-exe는 pyinstaller를 기반으로 하지만 pyinstaller와 비교하면 추가 GUI 인터페이스가 있습니다. . 저도 직접 사용해 보았는데 정말 유용하고 편리하다는 것을 알았습니다. 단 몇 번의 클릭만으로 프로그램을 패키징할 수 있습니다.
하지만 auto-py-to-exe나 pyinstaller 모두 동시에 여러 프로그램을 직접 패키징할 수는 없다는 걸 알았습니다. 여러 프로그램을 패키징하려면 다시 해야 하므로 프로그래머 입장에서는 참을 수 없는 일입니다. . 이를 바탕으로 pyinstaller 기반의 소규모 배치 패키징 프로그램을 작성했습니다.
pyinstaller 패키징 프로그램은 cmd 명령을 사용해야 합니다. 다음은 cmd 명령을 호출하는 일반적인 방법에 대한 간략한 소개입니다.
system()은 os 모듈에 내장된 함수로, 문자열을 명령으로 변환하고 터미널에서 실행할 수 있습니다.
def system(*args, **kwargs): # real signature unknown """ Execute the command in a subshell. """ pass
이 방법을 사용하는 것은 매우 간단합니다. 명령을 변환하기만 하면 됩니다. 문자열로 실행하려면 다음 함수에 넣으세요.
import os os.system(f'pyinstaller -F -w D:程序.py')
명령을 실행할 때 cmd 창은 기본적으로 IDE에 표시되지 않습니다. 생성된 파일은 기본적으로 동일한 디렉터리에 있습니다.
popen() 메소드 또한 os 모듈의 내장 함수이며 파이프라인을 통해 구현됩니다. 반환 값은 읽고 쓸 수 있는 파일 객체입니다. 기본값은 'r' 읽기입니다. 출력 내용은 객체의 read() 또는 readlines() 메서드를 호출하여 읽을 수 있습니다. 다음은 소스 코드입니다.
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)
사용법은 필요한 매개변수를 전달하고 읽기 또는 쓰기로만 실행하면 됩니다.
os.popen(f'pyinstaller -F -w D:程序.py').read()
실행 결과는 os .system() 과 동일하며, 생성된 파일은 같은 디렉터리에 있습니다.
subprocess 모듈은 공식적으로 일부 이전 모듈 메서드를 대체하는 데 사용되며 많은 콘텐츠 메서드를 포함하며 os.system() 및 os.popen()보다 더 완벽합니다. subprocess 모듈에는 cmd 명령을 호출하는 여러 가지 메서드, 즉 Popen, call, run 및 getstatusoutput이 있습니다. 여기서는 run() 메서드만 간략하게 설명합니다.
subprocess.run() 함수는 지정된 명령을 실행하고, 명령이 실행될 때까지 기다린 후, 실행 결과가 포함된 CompletedProcess 클래스의 인스턴스를 반환합니다.
사용법은 문자열 명령을 전달하는 os.system() 및 os.popen() 메서드와 동일하지만 매개변수 선택은 os.system() 및 os.popen()에 비해 훨씬 더 많습니다.
subprocess.run(f'pyinstaller -F -w D:程序.py')
The 기본적으로 이 메서드는 출력을 반환하지 않고 명령 및 실행 상태만 반환합니다.
우리는 이미 여러 프로그램이 cmd 명령을 호출하는 방법을 알고 있습니다. 이 기사에서는 사용 방법이 매우 간단합니다. 요구 사항이 더 복잡하다면 심층적인 조사를 수행할 수 있습니다.
GUI를 구축하는 데 사용되는 라이브러리는 PySimpleGUI입니다.
import os import PySimpleGUI as sg
아직 설치하지 않은 경우 pip 명령을 사용하여 설치할 수 있습니다.
pip intsall 库名
기능에 대한 특별한 요구 사항이 없기 때문에, 단 한 번의 작업으로 패키징하면 됩니다. 여러 프로그램이면 충분하며 최종 디자인 코드는 다음과 같습니다.
# 主题设置 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))
인터페이스는 다음과 같습니다.
Widget 인터페이스
The 인터페이스를 통해 얻은 파일 경로는 ";"으로 구분되며 나중에 분할해야 합니다. :
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('文件未选择!')
이 함수는 루프를 통해 읽어야 하는 목록을 수신하며 분할로 구분된 경로는 목록을 생성합니다. , 여전히 루프를 통해 읽어야 합니다. 프로그램 패키징 효과는 상대적으로 간단합니다. -F 및 -w는 각각 단일 실행 파일을 생성하고 명령줄 창 표시를 취소합니다.
def pyinstaller_(valuelist): for i in valuelist: a = i.split(';') for x in a: os.system(f'pyinstaller -F -w {x}')
최종 생성된 .exe 실행 파일 dist 파일에 저장됩니다:
가젯의 결과 .exe 파일
장점과 단점:
이 시점에서 우리는 Python을 사용하여 프로그램 일괄 패키징의 필요성을 해결하고 손을 자유롭게 했습니다.
위 내용은 Python을 사용하여 일괄 패키징 프로그램을 구현하는 도구~의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!