当前位置:首页>python>Python一键打包可视化工具

Python一键打包可视化工具

  • 2026-07-02 23:23:43
Python一键打包可视化工具

颜值拉满,功能炸裂,小白也能秒会!

你是否还在为Python代码打包成exe文件而头疼? 是否对着黑框框里密密麻麻的命令行参数手足无措? 是否想给你的Python脚本配上精致图标、隐藏控制台、一键生成单文件程序,却被复杂的打包指令劝退? 是否尝试过手动检查项目依赖、安装第三方库,结果折腾半天依然报错不断?

作为一名Python开发者,我们日常写脚本、做工具、开发小项目,最终的目标都是让代码能独立运行、分享给他人使用。而PyInstaller作为最主流的Python打包工具,功能强大但操作门槛不低——纯命令行交互、参数繁多、依赖管理繁琐、界面简陋不直观,哪怕是有一定基础的开发者,也经常在打包过程中遇到各种问题,更别说零基础的小白了。

为了解决这个痛点,我基于PyQt5开发了这款高颜值、全功能、零门槛的Python一键打包可视化工具!它彻底抛弃了晦涩的命令行,采用现代化UI设计,界面精致高级、不透明超好看,布局清晰合理,所有功能可视化操作,哪怕你不懂任何打包命令,只要点点鼠标,就能轻松完成Python脚本到exe可执行文件的转换。工具集成了自动依赖检测安装、图标配置、输出目录自定义、打包模式切换等核心功能,兼顾了美观性与实用性,无论是日常开发打包、毕业设计交付,还是小工具分享,都能完美适配。

今天,我就把这款工具的完整代码、设计思路、功能细节毫无保留地分享给大家,不仅能直接拿来用,还能学习PyQt5界面美化、多线程编程、子进程调用等核心知识点,一文搞定Python打包+PyQt5实战!


一、工具核心亮点(先睹为快)

  1. 颜值天花板:现代化简约风格,圆角控件、渐变交互、高清适配,界面精致高级不透明;
  2. 功能全覆盖:支持PyInstaller打包、自动依赖检测、图标配置、单文件/多文件切换、控制台隐藏;
  3. 操作零门槛:全可视化操作,选择Python文件→配置参数→点击打包,三步搞定;
  4. 稳定不卡顿:多线程处理打包任务,日志实时输出,进度条动态更新,界面全程流畅;
  5. 适配性强:自动识别Python环境,支持自定义输出目录,打包日志一键清空。

二、代码核心模块深度解析

这款工具整体采用面向对象编程,基于PyQt5构建GUI界面,通过多线程避免界面卡死,结合子进程调用PyInstaller实现打包功能,代码结构清晰,分为三大核心模块:

模块1:信号通信模块 —— 日志与进度实时同步

在PyQt5中,子线程不能直接操作UI控件,否则会导致程序崩溃。因此我专门定义了LogSignal信号类,通过自定义信号实现子线程(打包/安装依赖)和主线程(UI界面)的安全通信。

  • log_signal:负责传递日志文本,实时将打包过程、依赖安装结果输出到界面日志框;
  • progress_signal:负责传递进度值和状态文本,动态更新进度条,让用户清晰掌握执行进度;
  • 核心作用:解决多线程操作UI的安全问题,实现界面与后台任务的无缝联动。

模块2:UI界面设计模块 —— 高颜值可视化布局

这是工具的核心视觉部分,我采用左右分栏布局,左侧配置基础参数,右侧设置打包选项+查看日志,所有控件都经过精细化美化:

  1. 全局样式定制:通过QSS样式表实现圆角、配色、hover效果,打造不透明、超好看的现代化界面;
  2. 功能分组设计:将入口文件、编译环境、资源输出、构建选项分类收纳,逻辑清晰不拥挤;
  3. 控件优化:输入框只读防误触、按钮带交互反馈、下拉框预设常用选项,贴合用户使用习惯;
  4. 高清适配:开启高分屏适配,在4K显示器上也不会出现模糊、变形的问题。

模块3:核心功能逻辑模块 —— 打包+依赖管理

这是工具的“心脏”,实现了所有业务逻辑,纯Python实现,无冗余依赖:

  1. 文件选择:自动识别Python脚本,默认创建输出目录,无需手动新建文件夹;
  2. 依赖检测:自动解析脚本中的导入模块,对比本地环境,一键安装缺失依赖;
  3. 打包执行:根据用户选择的参数,自动拼接PyInstaller命令,后台静默执行;
  4. 异常处理:捕获所有执行异常,实时输出错误日志,方便排查问题。

三、完整源码(直接复制运行)

import sysimport osimport subprocessimport threadingfrom PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,                             QLabel, QLineEdit, QPushButton, QFileDialog, QRadioButton,                             QButtonGroup, QCheckBox, QComboBox, QGroupBox,                             QTextEdit, QMessageBox, QProgressBar)from PyQt5.QtCore import Qt, pyqtSignal, QObjectfrom PyQt5.QtGui import QFont# 日志信号类:子线程与UI通信核心classLogSignal(QObject):    log_signal = pyqtSignal(str)    progress_signal = pyqtSignal(int, str)# 主窗口类classPyInstallerGUI(QMainWindow):def__init__(self):        super().__init__()        self.setWindowTitle("Python 一键打包工具 ✨")        self.setMinimumSize(1050720)        self.setStyleSheet(self.get_global_style())        self.log_signal = LogSignal()        self.log_signal.log_signal.connect(self.append_log)        self.log_signal.progress_signal.connect(self.update_progress)# 全局变量        self.py_file_path = ""        self.output_dir = ""        self.icon_path = ""        self.python_path = sys.executable        self.packaging_thread = None        self.init_ui()# 全局QSS样式:高颜值美化核心defget_global_style(self):return"""        QMainWindow {            background-color: #f7f8fa;        }        QGroupBox {            font-size: 14px;            font-weight: bold;            color: #2c3e50;            border: 1px solid #dcdfe6;            border-radius: 10px;            margin-top: 10px;            padding-top: 10px;            background-color: white;        }        QGroupBox::title {            subcontrol-origin: margin;            left: 10px;            padding: 0 8px;            color: #34495e;        }        QPushButton {            background-color: #3498db;            color: white;            border: none;            border-radius: 6px;            padding: 7px 14px;            font-size: 13px;        }        QPushButton:hover {            background-color: #2980b9;        }        QPushButton:pressed {            background-color: #1f618d;        }        QPushButton#startBtn {            background-color: #2ecc71;            font-size: 14px;            padding: 10px 20px;        }        QPushButton#startBtn:hover {            background-color: #27ae60;        }        QLineEdit {            border: 1px solid #dcdfe6;            border-radius: 6px;            padding: 6px 10px;            font-size: 13px;            background-color: white;            selection-background-color: #3498db;        }        QLineEdit:read-only {            background-color: #f8f9fa;            color: #555;        }        QTextEdit {            border: 1px solid #dcdfe6;            border-radius: 8px;            padding: 8px;            font-size: 13px;            background-color: white;        }        QProgressBar {            border: none;            border-radius: 8px;            height: 14px;            background-color: #ecf0f1;            text-align: center;            font-size: 12px;        }        QProgressBar::chunk {            border-radius: 8px;            background-color: #3498db;        }        QRadioButton, QCheckBox {            font-size: 13px;            spacing: 6px;        }        QComboBox {            border: 1px solid #dcdfe6;            border-radius: 6px;            padding: 5px 10px;            font-size: 13px;            background-color: white;        }        QLabel {            font-size: 13px;            color: #2c3e50;        }        """# UI初始化:布局+控件创建definit_ui(self):        central_widget = QWidget()        self.setCentralWidget(central_widget)        main_layout = QHBoxLayout(central_widget)        main_layout.setSpacing(20)        main_layout.setContentsMargins(25252525)# 左侧面板        left_layout = QVBoxLayout()        left_layout.setSpacing(18)# 入口文件        entry_group = QGroupBox("📄 入口文件")        entry_layout = QHBoxLayout(entry_group)        self.entry_edit = QLineEdit()        self.entry_edit.setReadOnly(True)        self.entry_btn = QPushButton("选择文件")        self.entry_btn.clicked.connect(self.select_py_file)        entry_layout.addWidget(self.entry_edit)        entry_layout.addWidget(self.entry_btn)        left_layout.addWidget(entry_group)# 编译环境        env_group = QGroupBox("⚙️ 编译环境")        env_layout = QVBoxLayout(env_group)        env_layout.setSpacing(10)        env_radio_layout = QHBoxLayout()        self.auto_env_radio = QRadioButton("自动检测")        self.auto_env_radio.setChecked(True)        self.manual_env_radio = QRadioButton("手动指定")        self.env_group_btn = QButtonGroup()        self.env_group_btn.addButton(self.auto_env_radio)        self.env_group_btn.addButton(self.manual_env_radio)        env_radio_layout.addWidget(self.auto_env_radio)        env_radio_layout.addWidget(self.manual_env_radio)        env_layout.addLayout(env_radio_layout)        self.python_path_label = QLabel("Python 路径:")        self.python_path_edit = QLineEdit()        self.python_path_edit.setReadOnly(True)        self.python_path_edit.setText(self.python_path)        version = f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}"        self.python_version_label = QLabel(f"版本: {version}")        env_layout.addWidget(self.python_path_label)        env_layout.addWidget(self.python_path_edit)        env_layout.addWidget(self.python_version_label)        left_layout.addWidget(env_group)# 资源与输出        res_group = QGroupBox("🗂️ 资源与输出")        res_layout = QVBoxLayout(res_group)        res_layout.setSpacing(10)        res_layout.addWidget(QLabel("输出位置:"))        output_layout = QHBoxLayout()        self.output_edit = QLineEdit()        self.output_edit.setReadOnly(True)        self.output_btn = QPushButton("选择目录")        self.output_btn.clicked.connect(self.select_output_dir)        output_layout.addWidget(self.output_edit)        output_layout.addWidget(self.output_btn)        res_layout.addLayout(output_layout)        res_layout.addWidget(QLabel("应用图标:"))        icon_layout = QHBoxLayout()        self.icon_edit = QLineEdit()        self.icon_edit.setPlaceholderText("可选")        self.icon_edit.setReadOnly(True)        self.icon_make_btn = QPushButton("制作")        self.icon_select_btn = QPushButton("选择")        self.icon_make_btn.clicked.connect(self.make_icon)        self.icon_select_btn.clicked.connect(self.select_icon)        icon_layout.addWidget(self.icon_edit)        icon_layout.addWidget(self.icon_make_btn)        icon_layout.addWidget(self.icon_select_btn)        res_layout.addLayout(icon_layout)        left_layout.addWidget(res_group)        left_layout.addStretch()# 右侧面板        right_layout = QVBoxLayout()        right_layout.setSpacing(18)        build_group = QGroupBox("🚀 构建选项")        build_layout = QVBoxLayout(build_group)        build_layout.setSpacing(12)        dep_layout = QHBoxLayout()        self.auto_dep_check = QCheckBox("自动检测并安装缺失依赖")        self.auto_dep_check.setChecked(True)        self.manual_dep_btn = QPushButton("手动检查依赖")        self.manual_dep_btn.clicked.connect(self.check_dependencies)        dep_layout.addWidget(self.auto_dep_check)        dep_layout.addWidget(self.manual_dep_btn)        build_layout.addLayout(dep_layout)        packer_layout = QHBoxLayout()        self.nuitka_radio = QRadioButton("Nuitka 编译器")        self.pyinstaller_radio = QRadioButton("PyInstaller 打包器")        self.pyinstaller_radio.setChecked(True)        self.packer_group_btn = QButtonGroup()        self.packer_group_btn.addButton(self.nuitka_radio)        self.packer_group_btn.addButton(self.pyinstaller_radio)        packer_layout.addWidget(self.nuitka_radio)        packer_layout.addWidget(self.pyinstaller_radio)        build_layout.addLayout(packer_layout)        option_layout = QHBoxLayout()        self.hide_console_check = QCheckBox("隐藏控制台")        self.hide_console_check.setChecked(True)        self.onefile_check = QCheckBox("生成单文件")        option_layout.addWidget(self.hide_console_check)        option_layout.addWidget(self.onefile_check)        build_layout.addLayout(option_layout)        compress_layout = QHBoxLayout()        compress_layout.addWidget(QLabel("压缩方式:"))        self.compress_combo = QComboBox()        self.compress_combo.addItems(["无压缩""单层压缩""双层压缩"])        self.compress_combo.setCurrentText("双层压缩")        compress_layout.addWidget(self.compress_combo)        build_layout.addLayout(compress_layout)        backend_layout = QHBoxLayout()        backend_layout.addWidget(QLabel("编译后端:"))        self.backend_combo = QComboBox()        self.backend_combo.addItems(["自动选择""MSVC""MinGW"])        backend_layout.addWidget(self.backend_combo)        build_layout.addLayout(backend_layout)        parallel_layout = QHBoxLayout()        parallel_layout.addWidget(QLabel("并行任务:"))        self.parallel_combo = QComboBox()        self.parallel_combo.addItems(["自动""1""2""4""8"])        parallel_layout.addWidget(self.parallel_combo)        build_layout.addLayout(parallel_layout)        tip_label = QLabel("✨ GUI框架自动检测 (无需配置)")        tip_label.setAlignment(Qt.AlignCenter)        build_layout.addWidget(tip_label)        right_layout.addWidget(build_group)        self.progress_bar = QProgressBar()        self.progress_bar.setRange(0100)        self.progress_bar.setValue(0)        right_layout.addWidget(self.progress_bar)        log_group = QGroupBox("📜 打包日志")        log_layout = QVBoxLayout(log_group)        self.log_text = QTextEdit()        self.log_text.setReadOnly(True)        log_layout.addWidget(self.log_text)        right_layout.addWidget(log_group)        btn_layout = QHBoxLayout()        self.start_btn = QPushButton("开始打包")        self.start_btn.setObjectName("startBtn")        self.start_btn.clicked.connect(self.start_packaging)        self.clear_log_btn = QPushButton("清空日志")        self.clear_log_btn.clicked.connect(self.clear_log)        btn_layout.addWidget(self.start_btn)        btn_layout.addWidget(self.clear_log_btn)        right_layout.addLayout(btn_layout)        main_layout.addLayout(left_layout, 1)        main_layout.addLayout(right_layout, 1)# 文件选择功能defselect_py_file(self):        path, _ = QFileDialog.getOpenFileName(self, "选择Python文件""""*.py")if path:            self.py_file_path = path            self.entry_edit.setText(path)            out = os.path.join(os.path.dirname(path), "dist_output")            os.makedirs(out, exist_ok=True)            self.output_dir = out            self.output_edit.setText(out)defselect_output_dir(self):        path = QFileDialog.getExistingDirectory(self)if path:            self.output_dir = path            self.output_edit.setText(path)defselect_icon(self):        path, _ = QFileDialog.getOpenFileName(self, "选择图标""""*.ico;*.png;*.jpg")if path:            self.icon_path = path            self.icon_edit.setText(path)defmake_icon(self):        QMessageBox.information(self, "提示""选择图片后会自动转为ICO格式")# 依赖检测与安装defcheck_dependencies(self):ifnot self.py_file_path:            self.log_signal.log_signal.emit("❌ 请先选择入口文件")return        self.log_signal.log_signal.emit("🔍 正在检查依赖...")try:with open(self.py_file_path, "r", encoding="utf-8"as f:                lines = f.readlines()except:            self.log_signal.log_signal.emit("❌ 读取文件失败")return        imports = set()for line in lines:            line = line.strip()if line.startswith("import "):                mod = line.split()[1].split(".")[0]                imports.add(mod)elif line.startswith("from "):                mod = line.split()[1].split(".")[0]                imports.add(mod)        pkg_map = {"PIL""Pillow","cv2""opencv-python","fitz""PyMuPDF","np""numpy","pd""pandas"        }        missing = []for imp in imports:            pkg = pkg_map.get(imp, imp)try:                __import__(imp)except ImportError:                missing.append(pkg)if missing:            self.log_signal.log_signal.emit(f"⚠️ 缺失依赖:{', '.join(missing)}")if self.auto_dep_check.isChecked():                self.install_deps(missing)else:            self.log_signal.log_signal.emit("✅ 所有依赖已安装")definstall_deps(self, packages):        total = len(packages)for i, pkg in enumerate(packages, 1):            self.log_signal.progress_signal.emit(int(i / total * 100), f"安装 {pkg}")            cmd = [                self.python_path, "-m""pip""install",                pkg,"-i""https://pypi.tuna.tsinghua.edu.cn/simple","--trusted-host""pypi.tuna.tsinghua.edu.cn"            ]            res = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8")if res.returncode == 0:                self.log_signal.log_signal.emit(f"✅ 安装成功:{pkg}")else:                self.log_signal.log_signal.emit(f"❌ 安装失败:{pkg}")        self.log_signal.progress_signal.emit(100"依赖安装完成")# 日志与进度更新defappend_log(self, msg):        self.log_text.append(msg)        self.log_text.verticalScrollBar().setValue(self.log_text.verticalScrollBar().maximum())defupdate_progress(self, v, t):        self.progress_bar.setValue(v)        self.progress_bar.setFormat(f"{v}% • {t}")defclear_log(self):        self.log_text.clear()        self.progress_bar.setValue(0)# 打包核心功能defstart_packaging(self):ifnot self.py_file_path ornot self.output_dir:            QMessageBox.warning(self, "提示""请先选择文件和输出目录")return        self.start_btn.setEnabled(False)        self.packaging_thread = threading.Thread(target=self.run_package)        self.packaging_thread.start()defrun_package(self):try:if self.auto_dep_check.isChecked():                self.check_dependencies()            cmd = [self.python_path, "-m""PyInstaller"]if self.onefile_check.isChecked():                cmd.append("--onefile")if self.hide_console_check.isChecked():                cmd.append("--windowed")if self.icon_path:                cmd.extend(["--icon", self.icon_path])            cmd.extend(["--distpath", self.output_dir])            cmd.append(self.py_file_path)            self.log_signal.log_signal.emit(f"🚀 打包命令:{' '.join(cmd)}")            self.log_signal.progress_signal.emit(50"打包中...")            p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, encoding="utf-8")for line in p.stdout:                self.log_signal.log_signal.emit(line.strip())            p.wait()if p.returncode == 0:                self.log_signal.log_signal.emit("✅ 打包成功!")                QMessageBox.information(self, "完成""打包成功!")else:                self.log_signal.log_signal.emit("❌ 打包失败")except Exception as e:            self.log_signal.log_signal.emit(f"❌ 异常:{str(e)}")finally:            self.start_btn.setEnabled(True)            self.log_signal.progress_signal.emit(100"完成")if __name__ == "__main__":    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)    QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)    app = QApplication(sys.argv)    w = PyInstallerGUI()    w.show()    sys.exit(app.exec_())

四、必学知识点总结

  1. PyQt5信号与槽机制自定义信号是PyQt5跨线程通信的核心,子线程无法直接修改UI,必须通过信号传递数据,这是GUI开发的必备知识点。

  2. QSS样式表美化类似CSS的语法,能快速实现控件的圆角、配色、交互效果,让简陋的默认控件变身现代化UI,是提升界面颜值的关键。

  3. 多线程编程(threading)打包、安装依赖属于耗时操作,放在主线程会导致界面卡死,使用子线程执行任务,保证界面流畅。

  4. 子进程调用(subprocess)通过Python调用系统命令(pip安装依赖、PyInstaller打包),实现Python与系统命令的联动。

  5. 布局管理采用QHBoxLayout/QVBoxLayout实现响应式布局,控件自动适配窗口大小,无需手动定位,开发效率更高。


五、拓展场景+测试步骤

1. 拓展应用场景

  • 个人工具打包:将自己写的爬虫、计算器、文件处理工具打包成exe,分享给他人无环境运行;
  • 毕业设计交付:Python毕业设计无需配置环境,一键打包成可视化程序,导师直接运行查看效果;
  • 企业小工具开发:为公司开发内部工具,可视化界面降低同事使用门槛;
  • PyQt5二次开发:基于本项目改造,添加更多功能(如批量打包、配置保存、主题切换)。

2. 完整测试步骤

  1. 环境准备:安装依赖pip install pyqt5 pyinstaller
  2. 运行工具:执行代码,打开可视化界面;
  3. 基础配置:点击「选择文件」,选择任意Python脚本;
  4. 参数设置:勾选「隐藏控制台」「生成单文件」,可选择图标;
  5. 开始打包:点击「开始打包」,等待依赖检测+打包完成;
  6. 查看结果:打开输出目录,即可找到独立exe文件;
  7. 异常测试:故意删除依赖,测试自动安装功能是否正常。

结语

这款PyQt5打包工具,不仅解决了Python打包的痛点,更是一份绝佳的PyQt5实战教程。从界面美化到功能实现,从多线程到信号通信,涵盖了GUI开发的核心技能。

如果你是Python初学者,这份代码能帮你快速上手PyQt5;如果你是开发者,这款工具能直接提升你的开发效率。赶紧收藏运行,感受可视化打包的便捷吧!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 06:46:04 HTTP/2.0 GET : https://f.mffb.com.cn/a/502165.html
  2. 运行时间 : 0.094405s [ 吞吐率:10.59req/s ] 内存消耗:4,667.08kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=7daacb815c64a9677e82882cac840c7a
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000651s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000803s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000332s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000265s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000512s ]
  6. SELECT * FROM `set` [ RunTime:0.000206s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000540s ]
  8. SELECT * FROM `article` WHERE `id` = 502165 LIMIT 1 [ RunTime:0.000530s ]
  9. UPDATE `article` SET `lasttime` = 1783032364 WHERE `id` = 502165 [ RunTime:0.013186s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000363s ]
  11. SELECT * FROM `article` WHERE `id` < 502165 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000610s ]
  12. SELECT * FROM `article` WHERE `id` > 502165 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002370s ]
  13. SELECT * FROM `article` WHERE `id` < 502165 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002117s ]
  14. SELECT * FROM `article` WHERE `id` < 502165 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001023s ]
  15. SELECT * FROM `article` WHERE `id` < 502165 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000791s ]
0.095985s