diff --git a/README.md b/README.md index d793fd0..f124321 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,9 @@ PyPack 是一个基于 PyQt5 开发的图形化 Python 脚本打包与构建辅 --- # 更新日志 (Changelog) +### [1.0.2] - 2026-06-3 +* **更新子进程处理机制,并改进数据处理以提升兼容性。 +* **隐藏打包过程中的命令窗口。 ### [1.0.1] - 2026-05-31 #### 新增 diff --git a/main.py b/main.py index 6c9fb90..818f63b 100644 --- a/main.py +++ b/main.py @@ -191,8 +191,9 @@ class PackingThread(QThread): if self.process: try: if os.name == "nt": - # 在 Windows 下终止整个子进程树,防止编译器残留锁死文件 - subprocess.run(["taskkill", "/F", "/T", "/PID", str(self.process.pid)], capture_output=True) + # 在 Windows 下终止整个子进程树,防止编译器残留锁死文件 (增加 creationflags 隐藏结束进程的黑框) + subprocess.run(["taskkill", "/F", "/T", "/PID", str(self.process.pid)], + capture_output=True, creationflags=subprocess.CREATE_NO_WINDOW) else: self.process.kill() except: @@ -201,10 +202,19 @@ class PackingThread(QThread): def run_cmd_realtime(self, cmd, cwd=None): if self._is_cancelled: return False try: - self.process = subprocess.Popen( - cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, - text=True, encoding='utf-8', errors='replace', cwd=cwd - ) + kwargs = { + "stdout": subprocess.PIPE, + "stderr": subprocess.STDOUT, + "text": True, + "encoding": 'utf-8', + "errors": 'replace', + "cwd": cwd + } + # Windows 系统下静默执行,隐藏 CMD 黑窗口 + if os.name == 'nt': + kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW + + self.process = subprocess.Popen(cmd, **kwargs) while True: line = self.process.stdout.readline() if not line and self.process.poll() is not None: @@ -230,7 +240,7 @@ class PackingThread(QThread): script_path = self.params['script_path'] script_dir = Path(script_path).parent if "OneDrive" in str(script_path): - self.progress.emit("[警告] 工程位于 OneDrive 同同步目录中,文件可能被锁定导致构建失败,建议将工程迁移至本地路径。") + self.progress.emit("[警告] 工程位于 OneDrive 同步目录中,文件可能被锁定导致构建失败,建议将工程迁移至本地路径。") # 虚拟环境 if self.params['use_venv']: @@ -327,8 +337,13 @@ class PackingThread(QThread): if imp: cmd.extend(["--hidden-import", imp]) for d in self.params.get('add_data', '').split(','): d = d.strip() - if d: cmd.extend(["--add-data", d]) - + if d: + # 兼容 PyPack 统一的 ':' 语法,自动转换为 Windows PyInstaller 所需的 ';' + if os.name == 'nt' and ':' in d: + parts = d.rsplit(':', 1) # 从右拆分,防止破坏 C:\ 盘符 + if len(parts) == 2: + d = f"{parts[0]};{parts[1]}" + cmd.extend(["--add-data", d]) elif engine == "Nuitka": self.temp_out_dir = Path(tempfile.mkdtemp(prefix="nuitka_out_")) cmd = [python_exe, "-m", "nuitka", "--remove-output", "--assume-yes-for-downloads", @@ -357,7 +372,8 @@ class PackingThread(QThread): if d: parts = d.split(':', 1) if len(parts) == 2: - cmd.extend(["--include-data-files", f"{parts[0]}={parts[1]}"]) + # 修复:Nuitka 要求 --include-data-files 参数必须是完整字符串(由 = 拼接),不可分离 + cmd.append(f"--include-data-files={parts[0]}={parts[1]}") else: self.progress.emit(f"[警告] 附加资源格式错误,应为 src:dest,忽略: {d}")