Невозможно запустить pyshark.FileCapture (pcap) внутри класса QThread в linux Ubuntu 16.04 - PullRequest
1 голос
/ 06 марта 2020

У меня есть приложение PySide2, которое работает в windows. Он открывает файл сетевого пакета (pcap) с помощью библиотеки python pyshark внутри класса QThread. Он может открыть этот файл pcap, но когда я попытался запустить то же приложение в Ubuntu, он выдает ошибку. RuntimeError: Невозможно добавить дочерний обработчик, к дочернему наблюдателю не прикреплено al oop.

Я искал в Интернете решения и наткнулся на этот сайт -> 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_())


Мои текущие настройки среды:

  • Python 3.7,
  • Pyside2 5.13.2,
  • Pyshark 0.4.2.9 (последняя версия)
...