You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导入PyQt5.uic后PyInstaller打包的EXE运行Photoshop脚本时冻结问题

问题根因

  1. PyQt5.uic导入时会隐式初始化Qt运行时上下文,依赖Qt的消息循环机制。你使用subprocess.call()是阻塞式调用,会等待Photoshop进程退出才返回,而PyInstaller打包时引入的PyQt5运行时钩子,会和Photoshop这个GUI程序的Windows消息循环产生冲突,导致进程阻塞冻结。
  2. 你使用的PyInstaller 4.4属于旧版本,对PyQt5.uic的依赖处理存在已知缺陷,打包日志中出现的Hidden import "sip" not found!警告也说明依赖打包不全,异常的运行时环境在你未显式创建QApplication实例时会出现未定义行为,触发卡死问题。

可行解决方案

  • 显式初始化QApplication实例,调整subprocess调用参数,避免消息循环冲突,修改后的代码参考:
import sys
import subprocess
from PyQt5.QtWidgets import QApplication
from PyQt5 import uic

class Photoshop2021:
    def __init__(self):
        print("Created")

    def runBenchmark(self):
        cmd = [
            r"C:\Program Files\Adobe\Adobe Photoshop 2021\Photoshop.exe",
            r"C:\Program Files\Adobe\Adobe Photoshop 2021\Presets\Scripts\TCL Photoshop Benchmark_AUTO 2.3.jsxbin"
        ]
        # 关闭shell=True,指定创建无窗口进程,避免消息嵌套
        proc = subprocess.Popen(cmd, shell=False, creationflags=subprocess.CREATE_NO_WINDOW)
        # 如果需要等待脚本执行完成,使用communicate而非call
        proc.communicate()

if __name__ == "__main__":
    # 显式初始化QApplication,避免uic隐式初始化产生的异常
    app = QApplication(sys.argv)
    ps = Photoshop2021()
    ps.runBenchmark()
    sys.exit(app.quit())
  • 打包时补充缺失的依赖,排除不需要的冗余模块,调整打包命令为:
    pyinstaller --noconfirm --hidden-import sip --exclude-module _tkinter PhotoshopTest.py
  • 升级PyInstaller到5.x及以上最新版本,旧版本对PyQt5的依赖处理有多个已知bug,升级后可解决大部分隐式依赖导致的运行异常。

内容的提问来源于stack exchange,提问作者JuicyJuggles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:57:03