guo898989 2024-12-10 17:35 采纳率: 25%
浏览 19

cython加密后pyinstaller打包成exe闪退

我写了一个名字叫planning_platform.py的程序,然后写了一个main_application.py的入口主程序。
我正常用pyinstaller 打包入口主程序main_application.py时候程序可以正常运行,
但是当我给planning_platform.py和另一个ui.py文件先用cython加密后再打包主程序成exe后,界面可以正常弹出,但是随便点一个按钮后,程序会闪退,这是为什么啊,求教

main_application.py如下:

import pandas as pd
import datetime
import time
import numpy as np
from PyQt5.QtWidgets import QMainWindow, QApplication, QMessageBox, QWidget, QTableWidgetItem, QLineEdit,QStyleFactory
import hashlib
from ui import Ui_MainWindow
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import QtWidgets, uic
import os
import subprocess
import sys
from PyQt5.QtWidgets import QApplication, QStyleFactory
from planning_platform import myui
import planning_platform

from PyQt5 import QtCore, QtGui, QtWidgets


def main():
    # 设置应用程序风格
    # QApplication.setStyle(QStyleFactory.create("fusion"))
    # 创建应用程序实例
    app = QApplication(sys.argv)
    # 创建主窗口实例
    mainWindow = myui()
    # 显示主窗口
    mainWindow.show()
    # 运行应用程序事件循环
    sys.exit(app.exec_())


if __name__ == "__main__":

    main()

planning_platform.py如下:


import pandas as pd
import datetime
import time
import numpy as np
from PyQt5.QtWidgets import QMainWindow, QApplication, QMessageBox, QWidget, QTableWidgetItem, QLineEdit,QStyleFactory
import hashlib
from ui import Ui_MainWindow
import sys
from PyQt5 import QtWidgets, uic
import os
import subprocess


# QApplication.setStyle(QStyleFactory.create("fusion"))
# 风格:"fusion"/'windows'/

# start_time = time.perf_counter()
pd.set_option('expand_frame_repr', False)
# self.label_23.setPixmap(QtGui.QPixmap("C:\\Users\\Administrator\\PycharmProjects\\pythonProject\\logo.png"))
# pyminifier -O --replacement-length=50 --nonlatin your_script.py > obfuscated_script.py

class myui(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        try:
            super(myui, self).__init__(parent)
            self.setupUi(self)
            self.anjian.setEnabled(False)

app = QApplication(sys.argv)
# 创建主窗口实例
mainWindow = myui()
# 显示主窗口
mainWindow.show()
# 运行应用程序事件循环
sys.exit(app.exec_())
  • 写回答

1条回答 默认 最新

  • 越重天 新星创作者: Java技术领域 2024-12-13 12:41
    关注

    本答案参考多次询问ChatGPT-3.5后选择的最佳回答,若是满意,还请采纳,谢谢。

    1. 可能的原因分析
      • Cython加密相关问题
        • 模块导入错误
          • 当使用Cython加密文件后,可能会导致模块导入机制出现问题。例如,Cython可能会改变模块的命名空间或者内部结构,使得在运行时,原本正常的模块导入无法正确进行。在你的代码中,main_application.py导入了planning_platform.pyui.py,加密后可能导致这些导入的模块在内部逻辑上出现不兼容的情况。
          • 举例来说,如果planning_platform.py中有一些动态的模块导入或者相对导入,Cython加密可能会破坏这种导入逻辑。假设planning_platform.py中有类似from. import some_module的相对导入,Cython加密后可能会使这个相对导入路径解析错误。
        • 数据类型不兼容
          • Cython在加密过程中可能会对数据类型进行一些转换,这可能与PyQt5的内部数据类型处理不兼容。例如,在planning_platform.py中如果有涉及到将Python数据类型(如列表、字典)传递给PyQt5的组件进行显示或者处理,Cython加密后的类型转换可能会导致PyQt5组件无法正确处理这些数据。
          • 比如,你可能有一个函数在planning_platform.py中返回一个Python列表,这个列表被传递给ui.py中的一个QTableWidget来填充表格。Cython加密后,列表的数据类型可能在底层发生了变化,导致QTableWidget无法正确解析数据而出现闪退。
      • PyInstaller打包相关问题
        • 资源文件缺失或路径错误
          • 虽然界面能够正常弹出,但是点击按钮后闪退可能是因为某些资源文件(如图片、配置文件等)在打包后无法正确找到。当使用Cython加密后再打包,可能会影响文件的布局或者资源文件的相对路径。
          • 例如,如果ui.py中有加载图片资源的代码,如self.label_23.setPixmap(QtGui.QPixmap("C:\\Users\\Administrator\\PycharmProjects\\pythonProject\\logo.png")),在打包成EXE后,这个路径可能不再正确,因为打包后的文件结构发生了变化,导致找不到图片文件而闪退。
        • 打包时未包含所有依赖
          • 即使主程序main_application.py在未加密情况下打包运行正常,但加密后打包可能会遗漏一些依赖。PyInstaller可能没有正确识别Cython加密后的文件所依赖的库或者模块。
          • 比如,Cython加密后的planning_platform.py可能依赖于某个特定版本的numpy库,但是PyInstaller在打包时没有将这个特定版本的numpy库正确包含进去,导致在运行时出现闪退。
    2. 解决方案建议
      • 检查模块导入
        • 在加密后的代码中,仔细检查所有的模块导入语句。可以在代码中添加一些打印语句来查看模块导入的情况,例如在main_application.pyplanning_platform.py的导入语句前后添加print语句,查看导入是否按照预期进行。
        • 如果存在相对导入问题,可以尝试将相对导入改为绝对导入,确保在Cython加密后模块导入的正确性。
      • 数据类型检查
        • planning_platform.py中,检查所有与数据类型相关的操作,特别是涉及到与PyQt5组件交互的数据。可以在关键的数据传递和处理的地方添加类型检查代码,如isinstance函数来检查数据类型是否符合预期。
        • 如果发现数据类型不兼容的情况,可以尝试在Cython加密代码中进行适当的数据类型转换,使其与PyQt5组件兼容。
      • 资源文件处理
        • 对于资源文件,使用PyInstaller的--add - data选项来确保资源文件被正确打包。例如,如果有图片资源文件,在打包命令中添加类似pyinstaller main_application.py --add - data "C:\\Users\\Administrator\\PycharmProjects\\pythonProject\\logo.png;.",这里的;前面是资源文件的路径,后面是在打包后的相对路径(.表示当前目录)。
        • 在代码中,使用相对路径来引用资源文件,并且在打包后进行测试,确保资源文件能够正确加载。
      • 检查依赖完整性
        • 使用pyinstaller - - debug选项重新打包程序,查看是否有任何关于依赖缺失的警告或者错误信息。
        • 确保所有依赖的库都被正确包含在打包文件中,可以通过在main_application.py中显式地导入所有可能用到的库的子模块来确保PyInstaller能够识别并打包这些依赖。例如,如果只使用了numpyarray函数,也可以在代码中添加import numpy.random等其他子模块的导入语句,以确保numpy库被完整打包。
    评论

报告相同问题?

问题事件

  • 创建了问题 12月10日