使用ipython和asyncio的OSErrors

时间:2017-03-05 15:04:45

标签: python ipython python-asyncio python-3.6

有人知道为什么这会给我一个错误吗?我正在尝试执行

for p in bot.empire.planet_list:  
    bot.do(p.supply(bot.empire.settings.min_res))

在通过launch_ipython()生成的ipyhton实例中(源代码如下)。它发生在一段时间后(非确定性),我无法编写一个小程序来追逐相同的异常。如果有任何问题,请在评论中问我。我知道这是非常广泛的,对不起。

我正在使用python 3.6。

--------------------------------------------------------------------------- OSError                                   Traceback (most recent call last) /home/markus/Code/el_bot/script.py in main()
    109                 instances.bot.do(instances.bot.empire.refresh(elbot.RefreshFlags.ALL))
    110             try:
--> 111                 launch_ipython()
        global launch_ipython = <function launch_ipython at 0x7fe5d7c71620>
    112             except:
    113                 from IPython.core.ultratb import AutoFormattedTB

/home/markus/Code/el_bot/script.py in launch_ipython()
     81     frame.f_globals.update(frame.f_back.f_globals)  # modify references, no reassigning, this will be lost
     82     config = Config({'TerminalInteractiveShell': {'confirm_exit': False, 'banner1': ''}})  # no banner, exit on Crtl+D
---> 83     embed(config=config)
        global asyncio.set_event_loop = <function set_event_loop at 0x7fe5d881ac80>
        global loop = undefined
     84 

/home/markus/.virtualenvs/el_bot/lib/python3.6/site-packages/IPython/terminal/embed.py in embed(**kwargs={'config': {'TerminalInteractiveShell': {'confirm_exit': False, 'banner1': ''}}})
    314     frame = sys._getframe(1)
    315     shell = InteractiveShellEmbed.instance(_call_location_id='%s:%s' % (frame.f_code.co_filename, frame.f_lineno), **kwargs)
--> 316     shell(header=header, stack_depth=2, compile_flags=compile_flags)
        shell = <IPython.terminal.embed.InteractiveShellEmbed object at 0x7fe5d7c6ca90>
        header = ''
        global stack_depth = undefined
        compile_flags = None
    317     InteractiveShellEmbed.clear_instance()
    318     #restore previous instance

/home/markus/.virtualenvs/el_bot/lib/python3.6/site-packages/IPython/terminal/embed.py in __call__(self=<IPython.terminal.embed.InteractiveShellEmbed object>, header='', local_ns=None, module=None, dummy=None, stack_depth=2, global_ns=None, compile_flags=None)
    159         # our call and get the original caller's namespaces.
    160         self.mainloop(local_ns, module, stack_depth=stack_depth,
--> 161                       global_ns=global_ns, compile_flags=compile_flags)
        global_ns = None
        compile_flags = None
    162 
    163         self.banner2 = self.old_banner2

/home/markus/.virtualenvs/el_bot/lib/python3.6/site-packages/IPython/terminal/embed.py in mainloop(self=<IPython.terminal.embed.InteractiveShellEmbed object>, local_ns={'Config': <class 'traitlets.config.loader.Config'>, 'bot': <elbot.bot.Bot object>, 'bots': [<elbot.bot.Bot object>], 'config': {'TerminalInteractiveShell': {'confirm_exit': False, 'banner1': ''}}, 'embed': <function embed>, 'frame': <frame object>, 'inspect': <module 'inspect' from '/usr/lib64/python3.6/inspect.py'>}, module=<module '__main__' from 'script.py'>, stack_depth=2, display_banner=None, global_ns={'Coord': <class 'elbot.helper.coord.Coord'>, 'Thread': <class 'threading.Thread'>, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__cached__': None, '__doc__': None, '__file__': 'script.py', '__loader__': <_frozen_importlib_external.SourceFileLoader object>, '__name__': '__main__', '__package__': None, ...}, compile_flags=0)
    254 
    255         with self.builtin_trap, self.display_trap:
--> 256             self.interact()
        self.interact = <bound method TerminalInteractiveShell.interact of <IPython.terminal.embed.InteractiveShellEmbed object at 0x7fe5d7c6ca90>>
    257 
    258         # now, purge out the local namespace of IPython's hidden variables.

/home/markus/.virtualenvs/el_bot/lib/python3.6/site-packages/IPython/terminal/interactiveshell.py in interact(self=<IPython.terminal.embed.InteractiveShellEmbed object>, display_banner=<object object>)
    421 
    422             try:
--> 423                 code = self.prompt_for_code()
        code = "for p in bot.empire.planet_list:\n    bot.do(p.supply(bot.empire.settings.min_res, [bot.empire.get_planet('18:384:5')]))\n    "
        self.prompt_for_code = <bound method TerminalInteractiveShell.prompt_for_code of <IPython.terminal.embed.InteractiveShellEmbed object at 0x7fe5d7c6ca90>>
    424             except EOFError:
    425                 if (not self.confirm_exit) \

/home/markus/.virtualenvs/el_bot/lib/python3.6/site-packages/IPython/terminal/interactiveshell.py in prompt_for_code(self=<IPython.terminal.embed.InteractiveShellEmbed object>)
    331     def prompt_for_code(self):
    332         document = self.pt_cli.run(
--> 333             pre_run=self.pre_prompt, reset_current_buffer=True)
        global pre_run = undefined
        self.pre_prompt = <bound method TerminalInteractiveShell.pre_prompt of <IPython.terminal.embed.InteractiveShellEmbed object at 0x7fe5d7c6ca90>>
        global reset_current_buffer = undefined
    334         return document.text
    335 

/home/markus/.virtualenvs/el_bot/lib/python3.6/site-packages/prompt_toolkit/interface.py in run(self=<prompt_toolkit.interface.CommandLineInterface object>, reset_current_buffer=True, pre_run=<bound method TerminalInteractiveShell.pre_promp...hon.terminal.embed.InteractiveShellEmbed object>>)
    392                 self._redraw()
    393 
--> 394                 self.eventloop.run(self.input, self.create_eventloop_callbacks())
        self.eventloop.run = <bound method PosixEventLoop.run of <prompt_toolkit.eventloop.posix.PosixEventLoop object at 0x7fe5a9408438>>
        self.input = StdinInput(stdin=<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>)
        self.create_eventloop_callbacks = <bound method CommandLineInterface.create_eventloop_callbacks of <prompt_toolkit.interface.CommandLineInterface object at 0x7fe5a9428e80>>
    395         finally:
    396             # Clean up renderer. (This will leave the alternate screen, if we use

/home/markus/.virtualenvs/el_bot/lib/python3.6/site-packages/prompt_toolkit/eventloop/posix.py in run(self=<prompt_toolkit.eventloop.posix.PosixEventLoop object>, stdin=StdinInput(stdin=<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>), callbacks=<prompt_toolkit.interface._InterfaceEventLoopCallbacks object>)
     90                 self.stop()
     91 
---> 92         self.add_reader(stdin, read_from_stdin)
        self.add_reader = <bound method PosixEventLoop.add_reader of <prompt_toolkit.eventloop.posix.PosixEventLoop object at 0x7fe5a9408438>>
        stdin = StdinInput(stdin=<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>)
        read_from_stdin = <function PosixEventLoop.run.<locals>.read_from_stdin at 0x7fe5a9441bf8>
     93         self.add_reader(self._schedule_pipe[0], None)
     94 

/home/markus/.virtualenvs/el_bot/lib/python3.6/site-packages/prompt_toolkit/eventloop/posix.py in add_reader(self=<prompt_toolkit.eventloop.posix.PosixEventLoop object>, fd=0, callback=<function PosixEventLoop.run.<locals>.read_from_stdin>)
    278         fd = fd_to_int(fd)
    279         self._read_fds[fd] = callback
--> 280         self.selector.register(fd)
        self.selector.register = <bound method AutoSelector.register of <prompt_toolkit.eventloop.select.AutoSelector object at 0x7fe5a9408518>>
        fd = 0
    281 
    282     def remove_reader(self, fd):

/home/markus/.virtualenvs/el_bot/lib/python3.6/site-packages/prompt_toolkit/eventloop/select.py in register(self=<prompt_toolkit.eventloop.select.AutoSelector object>, fd=0)
     73 
     74         for sel in self._selectors:
---> 75             sel.register(fd)
        sel.register = <bound method Python3Selector.register of <prompt_toolkit.eventloop.select.Python3Selector object at 0x7fe5a9428d68>>
        fd = 0
     76 
     77     def unregister(self, fd):

/home/markus/.virtualenvs/el_bot/lib/python3.6/site-packages/prompt_toolkit/eventloop/select.py in register(self=<prompt_toolkit.eventloop.select.Python3Selector object>, fd=0)
    128         assert isinstance(fd, int)
    129         import selectors  # Inline import: Python3 only!
--> 130         self._sel.register(fd, selectors.EVENT_READ, None)
        self._sel.register = <bound method EpollSelector.register of <selectors.EpollSelector object at 0x7fe5a9428668>>
        fd = 0
        selectors.EVENT_READ = 1
    131 
    132     def unregister(self, fd):

/usr/lib64/python3.6/selectors.py in register(self=<selectors.EpollSelector object>, fileobj=0, events=1, data=None)
    410                 epoll_events |= select.EPOLLOUT
    411             try:
--> 412                 self._epoll.register(key.fd, epoll_events)
        self._epoll.register = <built-in method register of select.epoll object at 0x7fe5a94adbe8>
        key.fd = 0
        epoll_events = 1
    413             except BaseException:
    414                 super().unregister(fileobj)

OSError: [Errno 9] Bad file descriptor

源代码:

def launch_ipython():
    import inspect
    from traitlets.config.loader import Config
    from IPython.terminal.embed import embed
    from elbot.instances import bot, bots

    if bot or bots:
        pass  # in order not to lose them in refactoring

    frame = inspect.currentframe()
    frame.f_locals.update(frame.f_back.f_locals)    # get all the variables from the calling function, you can only
    frame.f_globals.update(frame.f_back.f_globals)  # modify references, no reassigning, this will be lost
    config = Config({'TerminalInteractiveShell': {'confirm_exit': False, 'banner1': ''}})  # no banner, exit on Crtl+D
    embed(config=config)
#member of class Bot, self.__loop = asyncio.get_event_loop()
def do(self, coro, wait=True):
    if wait:
        return self.__loop.run_until_complete(coro)
    else:
        asyncio.ensure_future(coro)
# member of Planet
async def supply(self, min_res: Resources, supply_from=None, max_res: Resources = None) -> None:
    # Uses asyncio (await), 
    # aiohttp (ClientSession.request) and 
    # aiopg (SELECT on database)
    # This is a top level method using stuff from all over the project

0 个答案:

没有答案