我有一个在 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(最新)