guysv / ilua

Portable Lua kernel for Jupyter
GNU General Public License v2.0
115 stars 11 forks source link

What exactly is required from the custom lua interpreter? #10

Closed hroncok closed 4 years ago

hroncok commented 4 years ago

Hey. I try to use ilua with a custom lua interpreted (used in RPM).

It seems the interpreter doesn't support being called with a file name as an argument. Before I approach RPM to request the functions ilua needs, I'd like to know the set of requirements. I figured it's easier to ask than to reverse engineer it.

So far I think it is:

Is there anythign else? Howe can I see what's happening to debug this?

guysv commented 4 years ago

accept filename as a command line argument

I guess that's really the essence of it, can't think of another requirement. For starters, before modifying RPM, I'd try to write a wrapper that accepts a script as argument, and sets up your custom interpreter as needed.

hroncok commented 4 years ago

The problem with debugging this is for me that even using this fails for me:

#/usr/bin/bash
exec /usr/bin/lua "$@"
$ ilua -i lua
Jupyter console 6.1.0

ILua 0.2.1
In [1]: print"a"                                                                                                                                                                                                                 
a

$ ilua -i luafake
Jupyter console 6.1.0

ILua 0.2.1
In [1]: print"a"2020-05-12T20:06:42+0200 [ilua.kernel.ILuaKernel#critical] Uncought exception in message handler                                                                                                                 
    Traceback (most recent call last):
      File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
        result = g.send(result)
      File "/usr/lib/python3.8/site-packages/ilua/kernelbase.py", line 196, in handle_message
        content = yield self.do_is_complete(**msg['content'])
      File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1613, in unwindGenerator
        return _cancellableInlineCallbacks(gen)
      File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1529, in _cancellableInlineCallbacks
        _inlineCallbacks(None, g, status)
    --- <exception caught here> ---
      File "/usr/lib/python3.8/site-packages/ilua/kernelbase.py", line 196, in handle_message
        content = yield self.do_is_complete(**msg['content'])
      File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
        result = g.send(result)
      File "/usr/lib/python3.8/site-packages/ilua/kernel.py", line 179, in do_is_complete
        result = yield self.proto.sendRequest({"type": "is_complete",
    builtins.AttributeError: 'ILuaKernel' object has no attribute 'proto'

In [1]: print"a"                                                                                                                                                                                                                 
/usr/lib/python3.8/site-packages/jupyter_console/ptshell.py:656: UserWarning: The kernel did not respond to an is_complete_request. Setting `use_kernel_is_complete` to False.
  warn('The kernel did not respond to an is_complete_request. '
2020-05-12T20:06:43+0200 [ilua.kernel.ILuaKernel#critical] Uncought exception in message handler
    Traceback (most recent call last):
      File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
        result = g.send(result)
      File "/usr/lib/python3.8/site-packages/ilua/kernelbase.py", line 193, in handle_message
        content = yield self.do_execute(**msg['content'])
      File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1613, in unwindGenerator
        return _cancellableInlineCallbacks(gen)
      File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1529, in _cancellableInlineCallbacks
        _inlineCallbacks(None, g, status)
    --- <exception caught here> ---
      File "/usr/lib/python3.8/site-packages/ilua/kernelbase.py", line 193, in handle_message
        content = yield self.do_execute(**msg['content'])
      File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
        result = g.send(result)
      File "/usr/lib/python3.8/site-packages/ilua/kernel.py", line 126, in do_execute
        result = yield self.proto.sendRequest({"type": "execute",
    builtins.AttributeError: 'ILuaKernel' object has no attribute 'proto'
guysv commented 4 years ago

Hmm, same script worked on my machine. Perhaps you need to change 'luafake' to './luafake' or wherever it's placed.

Further more, you can get more verbose output with ilua -l debug

I'm sorry about that unfortunate stack trace. It really is incomprehensible

hroncok commented 4 years ago

luafake is in PATH:

$ luafake 
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
> print"a"
a
>
$ ilua -l debug -i luafake
2020-05-12T22:14:02+0200 [ilua.kernel.ILuaKernel#debug] Launching child lua
2020-05-12T22:14:02+0200 [ilua.proto.OutputCapture#debug] Process is running
2020-05-12T22:14:02+0200 [ilua.proto.OutputCapture#debug] Received stdout data: b'Upon execvpe luafake [b\'luafake\', b\'/usr/lib/python3.8/site-packages/ilua/interp.lua\'] in environment id 140414718368224\n:Traceback (most recent call last):\n  File "/usr/lib64/python3.8/site-packages/twisted/internet/process.py", line 405, in _fork\n    self._execChild(path, uid, gid, executable, args,\n  File "/usr/lib64/python3.8/site-packages/twisted/internet/process.py", line 484, in _execChild\n    os.execvpe(executable, args, environment)\n  File "/usr/lib64/python3.8/os.py", line 577, in execvpe\n    _execvpe(file, args, env)\n  File "/usr/lib64/python3.8/os.py", line 609, in _execvpe\n    raise saved_exc\n  File "/usr/lib64/python3.8/os.py", line 601, in _execvpe\n    exec_func(fullname, *argrest)\nOSError: [Errno 8] Exec format error\n'
Jupyter console 6.1.0

That is indeed more interesting:

Traceback (most recent call last):
  File "/usr/lib64/python3.8/site-packages/twisted/internet/process.py", line 405, in _fork
    self._execChild(path, uid, gid, executable, args,
  File "/usr/lib64/python3.8/site-packages/twisted/internet/process.py", line 484, in _execChild
    os.execvpe(executable, args, environment)
  File "/usr/lib64/python3.8/os.py", line 577, in execvpe
    _execvpe(file, args, env)
  File "/usr/lib64/python3.8/os.py", line 609, in _execvpe
    raise saved_exc
  File "/usr/lib64/python3.8/os.py", line 601, in _execvpe
    exec_func(fullname, *argrest)
OSError: [Errno 8] Exec format error

It's was just a typo in shebang :)

hroncok commented 4 years ago

So far I'm blocked by https://github.com/rpm-software-management/rpm/issues/1215

But this seem to do the trick:

#!/usr/bin/bash
exec rpm --eval '%{lua:package.path = "'${LUA_PATH}';" .. package.path;'"$(cat "$@")"';rpm.interactive()}'

Thanks.

EDIT: the rpm.interactive() call is redundant, the executed file takes care of that