libfuse / pyfuse3

Python 3 bindings for libfuse 3 with asynchronous API (Trio compatible)
https://pyfuse3.readthedocs.io/
Other
166 stars 48 forks source link

Errors on PyPy3 #33

Open elonen opened 3 years ago

elonen commented 3 years ago

Should the library run on PyPy? Trying pyfuse3 v3.1.1 on PyPy 7.3.2, pyfuse3 compiles, but when I tried to run/mount the hello.py example:

# python hello.py /mnt/fuse
Traceback (most recent call last):
  File "hello.py", line 157, in <module>
    main()
  File "hello.py", line 148, in main
    trio.run(pyfuse3.main)
  File "/root/test/pypyvenv/site-packages/trio/_core/_run.py", line 1928, in run
    raise runner.main_task_outcome.error
  File "/root/test/pypyvenv/site-packages/_pyfuse3.py", line 30, in wrapper
    await fn(*args, **kwargs)
  File "src/pyfuse3.pyx", line 767, in main
  File "src/pyfuse3.pyx", line 770, in pyfuse3.main
AttributeError: 'NoneType' object has no attribute 'start_soon'

Same thing with hello_async.py:

# python hello_asyncio.py /mnt/fuse
Traceback (most recent call last):
  File "hello_asyncio.py", line 162, in <module>
    main()
  File "hello_asyncio.py", line 151, in main
    loop.run_until_complete(pyfuse3.main())
  File "/usr/lib/pypy3/lib-python/3/asyncio/base_events.py", line 488, in run_until_complete
    return future.result()
  File "/usr/lib/pypy3/lib-python/3/asyncio/futures.py", line 243, in result
    raise self._exception
  File "/usr/lib/pypy3/lib-python/3/asyncio/tasks.py", line 180, in _step
    result = coro.send(None)
  File "/root/test/pypyvenv/site-packages/_pyfuse3.py", line 30, in wrapper
    await fn(*args, **kwargs)
  File "src/pyfuse3.pyx", line 767, in main
  File "src/pyfuse3.pyx", line 770, in pyfuse3.main
AttributeError: 'NoneType' object has no attribute 'start_soon'

Package versions:

# pip freeze
async-generator==1.10
attrs==20.3.0
cffi==1.14.2
contextvars==2.4
greenlet==0.4.13
idna==2.10
immutables==0.14
outcome==1.1.0
Pillow==8.0.1
pyfuse3==3.1.1
readline==6.2.4.1
sniffio==1.2.0
sortedcontainers==2.3.0
trio==0.17.0

Trio claims to work on PyPy, so I'm wondering what's going on here. It also seems that even the asyncio example (hello_async.py) initializes through Trio somehow.

Nikratio commented 3 years ago

Thanks for the report! I am not sure what's going on here - trio.open_nursery() should return a nursery object, but in your case it returns None.

Could you run the following code directly in Pypy and check if it works?

async def foo():
        async with trio.open_nursery() as nursery:
           print(nursery)
trio.run(foo)

If this doesn't work, then my guess is that Pypi has not fully implemented the async with statement..

Regarding hello_async.py using trio - can you elaborate on what you mean? I do not see it using trio anywhere.

elonen commented 3 years ago

Both cpython and pypy returned a trio.Nursery object with that snippet:

# python test.py
<trio.Nursery object at 0x0000556fb4e42758>

The comment regarding hello_sync.py meant that since running it results in the same error on the same line, it apparently also tries to initialize using a trio.Nursery, altough the code doesn't explicly use it.

Nikratio commented 3 years ago

That's quite mystifying. Exactly the same code fragment seems to give None when used in pyfuse3.pyx. Maybe it's an issue with the C code that Cython generates from this...

Nikratio commented 3 years ago

(the way that asyncio support works is that the trio module is replaced by a stub, so this is expected)

Rprabudeva commented 3 years ago

I am actually doing project in my university, they asked me to contribute in any one of the project in github so I want to involve in this project so can you give permission to d

Nikratio commented 3 years ago

@Rprabudeva I'm having a very hard time understanding you, but I am still confident that what you are saying is misleading at best, and downright wrong at worst. I've deleted your previous comment to prevent it from confusing others about the issue. I will leave this one as-is, but please reconsider if contributing to this project is a good fit for your skills.

Nikratio commented 3 years ago

@elonen Could you also try the following please?

import functools
import trio

def async_wrapper(fn):
    @functools.wraps(fn)
    async def wrapper(*args, **kwargs):
        await fn(*args, **kwargs)
    return wrapper

@async_wrapper
async def foo():
        async with trio.open_nursery() as nursery:
           print(nursery)

trio.run(foo)

If that works, could you please install the newest Cython that you can get (ideally Git master) and rebuild everything (setup.py build_cython build_ext)?