1

我有一个在 Windows 中工作的 PySide2 应用程序。它的作用是使用 QThread 类中的 python pyshark 库打开一个网络数据包 (pcap) 文件。它能够打开该 pcap 文件,但是当我尝试在 ubuntu 上运行相同的应用程序时,它会引发错误。RuntimeError:无法添加子处理程序,子观察程序没有附加循环。

我在网上搜索了解决方案并偶然发现了这个网站-> https://github.com/KimiNewt/pyshark/issues/303

看来pyshark只能在主线程中运行,不能在子线程中运行。我还创建了一个最小示例来复制我的问题,如下所示。

import sys
import pyshark
import asyncio
from PySide2.QtCore import QThread, Qt, Slot
from PySide2.QtWidgets import QApplication, QMainWindow, QFrame, QHBoxLayout, QPushButton


class SubThread(QThread):
    def __init__(self):
        super(SubThread, self).__init__()
        self.Input_file = "profibus.pcap"

    def run(self):
        print("thread is running!")
        cap = pyshark.FileCapture(self.Input_file)
        iter_obj = iter(cap)
        pkt = next(iter_obj)
        print(pkt)
        cap.close()

class TopLayout(QFrame):
    def __init__(self, sub_thread):
        self.frame = QFrame()
        self.layout = QHBoxLayout()
        self.sub_thread = sub_thread

        self.toggle_button_box = QHBoxLayout()
        self.toggle_button = QPushButton("Start")
        self.toggle_button.setCheckable(True)
        self.toggle_button_box.addWidget(self.toggle_button)

        self.layout.addLayout(self.toggle_button_box)
        self.layout.setAlignment(Qt.AlignCenter)

        self.frame.setLayout(self.layout)
        self.toggle_button.clicked.connect(self.on_toggle_button_clicked)



    @Slot()
    def on_toggle_button_clicked(self):
        self.sub_thread.start()


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.SubThread = SubThread()
        self.top_layout = TopLayout(self.SubThread)

        self.setCentralWidget(self.top_layout.frame)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    # Execute application
    sys.exit(app.exec_())


我当前的环境配置是:

  • 蟒蛇3.7,
  • Pyside2 5.13.2,
  • Pyshark 0.4.2.9(最新)
4

0 回答 0