有人知道为什么这会给我一个错误吗?我正在尝试执行
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