CommandInvokeError: Команда вызвала исключение: RuntimeError: Невозможно запустить цикл обработки событий во время выполнения другого цикла При обнаружении пакетов - PullRequest
1 голос
/ 01 июня 2019

Я пытаюсь перехватить пакеты на основе параметров, отправленных через разногласия, а затем отправить файл захвата на канал, где был вызван бот. У меня проблемы с захватом части пакета, что, как я полагаю, вызвано функцией Sniff PyShark, использующей asyncio.

Я пробовал много вещей, в том числе ставил мою функцию сниффинга как асинхронную, использовал .get_event_loop (), использовал функцию ожидания ажиотажа и т. Д. Я довольно потерян и разочарован. Вот часть кода, который я пробовал:

import sharkBot 
import asyncio
from discord.ext import commands
import discord 
TOKEN = '<Bot Token Here>'
bot = commands.Bot(command_prefix='!')
shark = sharkBot.sharkBot()
@bot.command()
async def cap (ctx, *args):
    #Create dictionary for storing values
    values = {}
    params = {'p' : 'packet_count', 'o' : 'output_file', 't' : 'tshark_path'}
    #Add values to dictionary
    for arg in args:
        arg = arg.replace('-', '')
        value = arg[arg.find("(")+1:arg.find(")")]
        sep = '('
        arg = arg.split(sep, 1)[0]
        command = params.get(arg, "Invalid Command")
        values[command] = value
    #Sniff packet based on values
        packets = asyncio.get_event_loop().run_until_complete(packetCap(values))
        await ctx.send(packets)
def packetCap(values):
    capture = shark.capturePacketsByCount(**values)
    return capture
bot.run(TOKEN)

CapturePacketsByCount (** значения):

def capturePacketsByCount(self, interface="en0", packet_count=100, tshark_path="/<PATH NAME>", output_file=None):
        #capture specified number of packets 
        self.capture = pyshark.LiveCapture(tshark_path=tshark_path, interface=interface, output_file=output_file)
        self.capture.sniff(packet_count=packet_count)
        self.caplen = len(self.capture)
        #capture packets for given amount of time
        return self.capture

Я также попытался заменить последние две строки в шапке следующими фрагментами:

packets = await shark.capturePacketsByCount(**values)
await ctx.send(packets)

Я также попытался сделать асинхронные функции packetCap и capturePacketsByCount.

Я получаю ошибку:

 File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/discord/ext/commands/core.py", line 79, in wrapped
    ret = await coro(*args, **kwargs)
  File "bot2.py", line 23, in cap
    x = asyncio.get_event_loop().run_until_complete(packetCap(values))
  File "bot2.py", line 26, in packetCap
    x = shark.capturePacketsByCount(**values)
  File "/Users/cooldude/Projects/PySharkStuff/PySharkBot/sharkBot.py", line 12, in capturePacketsByCount
    self.capture.sniff(packet_count=packet_count)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyshark/capture/capture.py", line 133, in load_packets
    self.apply_on_packets(keep_packet, timeout=timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyshark/capture/capture.py", line 248, in apply_on_packets
    return self.eventloop.run_until_complete(coro)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/base_events.py", line 455, in run_until_complete
    self.run_forever()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/base_events.py", line 412, in run_forever
    'Cannot run the event loop while another loop is running')
RuntimeError: Cannot run the event loop while another loop is running

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/discord/ext/commands/bot.py", line 859, in invoke
    await ctx.command.invoke(ctx)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/discord/ext/commands/core.py", line 725, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/discord/ext/commands/core.py", line 88, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: RuntimeError: Cannot run the event loop while another loop is running

Спасибо за любую помощь, которую вы можете оказать мне.

...