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

PyInstaller编译后MyApp重启异常,提示无法识别参数求助

问题分析与解决方案

报错的核心原因是PyInstaller编译后的可执行文件不需要用-m __main__参数启动。你在Linux环境的冻结分支里添加了这个参数,导致程序把自身的路径(/home/myapp/MyApp)误判为未识别的命令行参数,触发了argparse的错误。

修正后的重启代码

直接去掉冻结状态下Linux分支的-m __main__参数即可:

class RestartCommand(Command):
    @property
    def help(self) -> str:
        return "Restarts the app"

    def __call__(self, arg: str, user: User) -> Optional[str]:
        self._myapp.close()
        try:
            if 'frozen' in sys.builtin_module_names:
                executable = sys.executable
                if sys.platform == "win32":
                    subprocess.run([executable] + sys.argv[1:])
                else:
                    # 去掉多余的 -m __main__ 参数,直接调用编译后的可执行文件
                    subprocess.run([executable] + sys.argv[1:])
            else:
                args = sys.argv
                if sys.platform == "win32":
                    subprocess.run([sys.executable] + args)
                else:
                    args.insert(0, sys.executable)
                    os.execv(sys.executable, args)
        except Exception as e:
            print("Error while restarting: ", e)

补充说明

  1. PyInstaller编译后的二进制程序是独立运行的,sys.executable指向的就是这个可执行文件本身,直接调用即可,不需要额外的模块启动参数。
  2. 如果需要保留用户启动时传入的原参数,sys.argv[1:]是正确的选择,它会排除掉程序自身的路径(sys.argv[0]),只传递后续参数。
  3. 你之前尝试移除sys.argv但保留了-m __main__,这仍然会导致程序将executable路径后的参数(这里就是-m和__main__)解析为命令行参数,进而和你的argparse定义冲突。

内容的提问来源于stack exchange,提问作者Yukie Satoshi Nobuharu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:30:23