neovim/pynvim

OSError: EOF when trying to run example code on Windows

Toqozz opened this issue · 11 comments

I'm trying to run the example code on the main page of the README, namely:

>>> from pynvim import attach
>>> nvim = attach('child', argv=["/bin/env", "nvim", "--embed", "--headless"])

But I get an error instead:

>>> from pynvim import attach
>>> nvim = attach('child', argv=['C:\\Users\\Toqoz\\Documents\\code\\neovim-test\\Neovim2\\bin\\nvim.exe', '--embed', '--headless'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Toqoz\AppData\Roaming\Python\Python39\site-packages\pynvim\__init__.py", line 122, in attach
    return Nvim.from_session(session).with_decode(decode)
  File "C:\Users\Toqoz\AppData\Roaming\Python\Python39\site-packages\pynvim\api\nvim.py", line 80, in from_session
    channel_id, metadata = session.request(b'nvim_get_api_info')
  File "C:\Users\Toqoz\AppData\Roaming\Python\Python39\site-packages\pynvim\msgpack_rpc\session.py", line 98, in request
    raise OSError('EOF')
OSError: EOF

Running the same thing from a script gives a bit more info, but I think it's irrelevant:

Traceback (most recent call last):
  File "C:\Users\Toqoz\Documents\code\neovim-test\something.py", line 4, in <module>
    nvim = attach('child', argv=['C:\\Users\\Toqoz\\Documents\\code\\neovim-test\\Neovim2\\bin\\nvim.exe', "--embed"])
  File "C:\Users\Toqoz\AppData\Roaming\Python\Python39\site-packages\pynvim\__init__.py", line 122, in attach
    return Nvim.from_session(session).with_decode(decode)
  File "C:\Users\Toqoz\AppData\Roaming\Python\Python39\site-packages\pynvim\api\nvim.py", line 80, in from_session
    channel_id, metadata = session.request(b'nvim_get_api_info')
  File "C:\Users\Toqoz\AppData\Roaming\Python\Python39\site-packages\pynvim\msgpack_rpc\session.py", line 98, in request
    raise OSError('EOF')
OSError: EOF
Exception ignored in: <function BaseSubprocessTransport.__del__ at 0x00000254C7607D30>
Traceback (most recent call last):
  File "C:\Users\Toqoz\AppData\Local\Programs\Python\Python39\lib\asyncio\base_subprocess.py", line 126, in __del__
  File "C:\Users\Toqoz\AppData\Local\Programs\Python\Python39\lib\asyncio\base_subprocess.py", line 104, in close
  File "C:\Users\Toqoz\AppData\Local\Programs\Python\Python39\lib\asyncio\proactor_events.py", line 108, in close
  File "C:\Users\Toqoz\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 746, in call_soon
  File "C:\Users\Toqoz\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 510, in _check_closed
RuntimeError: Event loop is closed
Exception ignored in: <function _ProactorBasePipeTransport.__del__ at 0x00000254C7637670>
Traceback (most recent call last):
  File "C:\Users\Toqoz\AppData\Local\Programs\Python\Python39\lib\asyncio\proactor_events.py", line 115, in __del__
  File "C:\Users\Toqoz\AppData\Local\Programs\Python\Python39\lib\asyncio\proactor_events.py", line 79, in __repr__
  File "C:\Users\Toqoz\AppData\Local\Programs\Python\Python39\lib\asyncio\windows_utils.py", line 102, in fileno
ValueError: I/O operation on closed pipe

Any pointers? I've also tried connecting using a socket but that also behaves weirdly on Windows.

$ python -- version
Python 3.9.6

The neovim is already running? I think it is not running.

I thought the purpose of this code was to launch neovim as a child process and attach to that.

If I launch neovim (externally, just by running it) and then run the code I get the same error.

The backslash escape is needed in single quotes?

Seems like it...

  File "C:\Users\Toqoz\Documents\code\neovim-test\something.py", line 4
    nvim = attach('child', argv=['C:\Users\Toqoz\Documents\code\neovim-test\Neovim2\bin\nvim.exe', "--embed"])
                                                                                                 ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

I'm fairly sure it is finding nvim.exe since if you change the path you get a file not found error.

Hm. You should enable log.

Reproduced it on neovim 0.7 Windows version. It works on older neovim(0.5) or Linux neovim.
So I think something is changed.

Unfortunately, pynvim is not maintained well. neovim maintainers want to use Lua language instead.

Note: if_python3 works well.

Ah, thanks for that. I'll look into getting something else working.

neovim 0.4.4 was the latest version I was able to pynvim to work well with. For context, I'm on windows trying to use the ActualVim plugin on Sublime Text 4.

Any updates on this? Tried it using Neovim 0.9.0 but still doesnt work..

Since CI (github actions) is online now, Windows CI jobs are showing similar failures (python 3.10, 3.11) :

test/test_buffer.py::test_options ERROR                                  [ 10%]
  Exception ignored in: <function BaseSubprocessTransport.__del__ at 0x0000026941A645E0>
  Traceback (most recent call last):
    File "C:\hostedtoolcache\windows\Python\3.11.4\x64\Lib\asyncio\base_subprocess.py", line 126, in __del__
      self.close()
    File "C:\hostedtoolcache\windows\Python\3.11.4\x64\Lib\asyncio\base_subprocess.py", line 104, in close
      proto.pipe.close()
    File "C:\hostedtoolcache\windows\Python\3.11.4\x64\Lib\asyncio\proactor_events.py", line 109, in close
      self._loop.call_soon(self._call_connection_lost, None)
    File "C:\hostedtoolcache\windows\Python\3.11.4\x64\Lib\asyncio\base_events.py", line 761, in call_soon
      self._check_closed()
    File "C:\hostedtoolcache\windows\Python\3.11.4\x64\Lib\asyncio\base_events.py", line [51](https://github.com/neovim/pynvim/actions/runs/5559406058/jobs/10155486134#step:8:52)9, in _check_closed
  Error:     raise RuntimeError('Event loop is closed')

neovim/neovim@c86d5fa (#11390) seems to be the culprit: stderr gets closed immediately and this causes the event loop to stop. See PR #543 for the fix.