Skip to main content

Python wrapper around Lua and LuaJIT

Project description

Lupapy

This is a fork of the original Lupa project, due to re-packaging reasons. All credits go to original author of Lupa: Stefan Behnel.

All source code is untouched as in original repository, all issue and PR code related should be submit to Lupa project.

With this fork it is possible to take advantage of LuaJIT 2.1 under Windows, only one difference is package name lupapy instead of lupa.

  1. Install lupapy:

    $ pip install lupapy
  2. Usage:

import lupa.luajit21 as lupa

print(f"Using {lupa.LuaRuntime().lua_implementation} (compiled with {lupa.LUA_VERSION})")

Lupa

logo/logo-220x200.png

Lupa integrates the runtimes of Lua or LuaJIT2 into CPython. It is a partial rewrite of LunaticPython in Cython with some additional features such as proper coroutine support.

For questions not answered here, please contact the Lupa mailing list.

Major features

  • separate Lua runtime states through a LuaRuntime class

  • Python coroutine wrapper for Lua coroutines

  • iteration support for Python objects in Lua and Lua objects in Python

  • proper encoding and decoding of strings (configurable per runtime, UTF-8 by default)

  • frees the GIL and supports threading in separate runtimes when calling into Lua

  • tested with Python 2.7/3.6 and later

  • ships with Lua 5.1, 5.2, 5.3 and 5.4 as well as LuaJIT 2.0 and 2.1 on systems that support it.

  • easy to hack on and extend as it is written in Cython, not C

Why the name?

In Latin, “lupa” is a female wolf, as elegant and wild as it sounds. If you don’t like this kind of straight forward allegory to an endangered species, you may also happily assume it’s just an amalgamation of the phonetic sounds that start the words “Lua” and “Python”, two from each to keep the balance.

Why use it?

It complements Python very well. Lua is a language as dynamic as Python, but LuaJIT compiles it to very fast machine code, sometimes faster than many statically compiled languages for computational code. The language runtime is very small and carefully designed for embedding. The complete binary module of Lupa, including a statically linked LuaJIT2 runtime, only weighs some 800KB on a 64 bit machine. With standard Lua 5.2, it’s less than 600KB.

However, the Lua ecosystem lacks many of the batteries that Python readily includes, either directly in its standard library or as third party packages. This makes real-world Lua applications harder to write than equivalent Python applications. Lua is therefore not commonly used as primary language for large applications, but it makes for a fast, high-level and resource-friendly backup language inside of Python when raw speed is required and the edit-compile-run cycle of binary extension modules is too heavy and too static for agile development or hot-deployment.

Lupa is a very fast and thin wrapper around Lua or LuaJIT. It makes it easy to write dynamic Lua code that accompanies dynamic Python code by switching between the two languages at runtime, based on the tradeoff between simplicity and speed.

Which Lua version?

The binary wheels include different Lua versions as well as LuaJIT, if supported. By default, import lupa uses the latest Lua version, but you can choose a specific one via import:

try:
    import lupa.luajit21 as lupa
except ImportError:
    try:
        import lupa.lua54 as lupa
    except ImportError:
        try:
            import lupa.lua53 as lupa
        except ImportError:
            import lupa

print(f"Using {lupa.LuaRuntime().lua_implementation} (compiled with {lupa.LUA_VERSION})")

Examples

>>> from lupa.lua54 import LuaRuntime
>>> lua = LuaRuntime(unpack_returned_tuples=True)

>>> lua.eval('1+1')
2

>>> lua_func = lua.eval('function(f, n) return f(n) end')

>>> def py_add1(n): return n+1
>>> lua_func(py_add1, 2)
3

>>> lua.eval('python.eval(" 2 ** 2 ")') == 4
True
>>> lua.eval('python.builtins.str(4)') == '4'
True

The function lua_type(obj) can be used to find out the type of a wrapped Lua object in Python code, as provided by Lua’s type() function:

>>> lupa.lua_type(lua_func)
'function'
>>> lupa.lua_type(lua.eval('{}'))
'table'

To help in distinguishing between wrapped Lua objects and normal Python objects, it returns None for the latter:

>>> lupa.lua_type(123) is None
True
>>> lupa.lua_type('abc') is None
True
>>> lupa.lua_type({}) is None
True

Note the flag unpack_returned_tuples=True that is passed to create the Lua runtime. It is new in Lupa 0.21 and changes the behaviour of tuples that get returned by Python functions. With this flag, they explode into separate Lua values:

>>> lua.execute('a,b,c = python.eval("(1,2)")')
>>> g = lua.globals()
>>> g.a
1
>>> g.b
2
>>> g.c is None
True

When set to False, functions that return a tuple pass it through to the Lua code:

>>> non_explode_lua = lupa.LuaRuntime(unpack_returned_tuples=False)
>>> non_explode_lua.execute('a,b,c = python.eval("(1,2)")')
>>> g = non_explode_lua.globals()
>>> g.a
(1, 2)
>>> g.b is None
True
>>> g.c is None
True

Since the default behaviour (to not explode tuples) might change in a later version of Lupa, it is best to always pass this flag explicitly.

Python objects in Lua

Python objects are either converted when passed into Lua (e.g. numbers and strings) or passed as wrapped object references.

>>> wrapped_type = lua.globals().type     # Lua's own type() function
>>> wrapped_type(1) == 'number'
True
>>> wrapped_type('abc') == 'string'
True

Wrapped Lua objects get unwrapped when they are passed back into Lua, and arbitrary Python objects get wrapped in different ways:

>>> wrapped_type(wrapped_type) == 'function'  # unwrapped Lua function
True
>>> wrapped_type(len) == 'userdata'       # wrapped Python function
True
>>> wrapped_type([]) == 'userdata'        # wrapped Python object
True

Lua supports two main protocols on objects: calling and indexing. It does not distinguish between attribute access and item access like Python does, so the Lua operations obj[x] and obj.x both map to indexing. To decide which Python protocol to use for Lua wrapped objects, Lupa employs a simple heuristic.

Pratically all Python objects allow attribute access, so if the object also has a __getitem__ method, it is preferred when turning it into an indexable Lua object. Otherwise, it becomes a simple object that uses attribute access for indexing from inside Lua.

Obviously, this heuristic will fail to provide the required behaviour in many cases, e.g. when attribute access is required to an object that happens to support item access. To be explicit about the protocol that should be used, Lupa provides the helper functions as_attrgetter() and as_itemgetter() that restrict the view on an object to a certain protocol, both from Python and from inside Lua:

>>> lua_func = lua.eval('function(obj) return obj["get"] end')
>>> d = {'get' : 'value'}

>>> value = lua_func(d)
>>> value == d['get'] == 'value'
True

>>> value = lua_func( lupa.as_itemgetter(d) )
>>> value == d['get'] == 'value'
True

>>> dict_get = lua_func( lupa.as_attrgetter(d) )
>>> dict_get == d.get
True
>>> dict_get('get') == d.get('get') == 'value'
True

>>> lua_func = lua.eval(
...     'function(obj) return python.as_attrgetter(obj)["get"] end')
>>> dict_get = lua_func(d)
>>> dict_get('get') == d.get('get') == 'value'
True

Note that unlike Lua function objects, callable Python objects support indexing in Lua:

>>> def py_func(): pass
>>> py_func.ATTR = 2

>>> lua_func = lua.eval('function(obj) return obj.ATTR end')
>>> lua_func(py_func)
2
>>> lua_func = lua.eval(
...     'function(obj) return python.as_attrgetter(obj).ATTR end')
>>> lua_func(py_func)
2
>>> lua_func = lua.eval(
...     'function(obj) return python.as_attrgetter(obj)["ATTR"] end')
>>> lua_func(py_func)
2

Iteration in Lua

Iteration over Python objects from Lua’s for-loop is fully supported. However, Python iterables need to be converted using one of the utility functions which are described here. This is similar to the functions like pairs() in Lua.

To iterate over a plain Python iterable, use the python.iter() function. For example, you can manually copy a Python list into a Lua table like this:

>>> lua_copy = lua.eval('''
...     function(L)
...         local t, i = {}, 1
...         for item in python.iter(L) do
...             t[i] = item
...             i = i + 1
...         end
...         return t
...     end
... ''')

>>> table = lua_copy([1,2,3,4])
>>> len(table)
4
>>> table[1]   # Lua indexing
1

Python’s enumerate() function is also supported, so the above could be simplified to:

>>> lua_copy = lua.eval('''
...     function(L)
...         local t = {}
...         for index, item in python.enumerate(L) do
...             t[ index+1 ] = item
...         end
...         return t
...     end
... ''')

>>> table = lua_copy([1,2,3,4])
>>> len(table)
4
>>> table[1]   # Lua indexing
1

For iterators that return tuples, such as dict.iteritems(), it is convenient to use the special python.iterex() function that automatically explodes the tuple items into separate Lua arguments:

>>> lua_copy = lua.eval('''
...     function(d)
...         local t = {}
...         for key, value in python.iterex(d.items()) do
...             t[key] = value
...         end
...         return t
...     end
... ''')

>>> d = dict(a=1, b=2, c=3)
>>> table = lua_copy( lupa.as_attrgetter(d) )
>>> table['b']
2

Note that accessing the d.items method from Lua requires passing the dict as attrgetter. Otherwise, attribute access in Lua would use the getitem protocol of Python dicts and look up d['items'] instead.

None vs. nil

While None in Python and nil in Lua differ in their semantics, they usually just mean the same thing: no value. Lupa therefore tries to map one directly to the other whenever possible:

>>> lua.eval('nil') is None
True
>>> is_nil = lua.eval('function(x) return x == nil end')
>>> is_nil(None)
True

The only place where this cannot work is during iteration, because Lua considers a nil value the termination marker of iterators. Therefore, Lupa special cases None values here and replaces them by a constant python.none instead of returning nil:

>>> _ = lua.require("table")
>>> func = lua.eval('''
...     function(items)
...         local t = {}
...         for value in python.iter(items) do
...             table.insert(t, value == python.none)
...         end
...         return t
...     end
... ''')

>>> items = [1, None ,2]
>>> list(func(items).values())
[False, True, False]

Lupa avoids this value escaping whenever it’s obviously not necessary. Thus, when unpacking tuples during iteration, only the first value will be subject to python.none replacement, as Lua does not look at the other items for loop termination anymore. And on enumerate() iteration, the first value is known to be always a number and never None, so no replacement is needed.

>>> func = lua.eval('''
...     function(items)
...         for a, b, c, d in python.iterex(items) do
...             return {a == python.none, a == nil,   -->  a == python.none
...                     b == python.none, b == nil,   -->  b == nil
...                     c == python.none, c == nil,   -->  c == nil
...                     d == python.none, d == nil}   -->  d == nil ...
...         end
...     end
... ''')

>>> items = [(None, None, None, None)]
>>> list(func(items).values())
[True, False, False, True, False, True, False, True]

>>> items = [(None, None)]   # note: no values for c/d => nil in Lua
>>> list(func(items).values())
[True, False, False, True, False, True, False, True]

Note that this behaviour changed in Lupa 1.0. Previously, the python.none replacement was done in more places, which made it not always very predictable.

Lua Tables

Lua tables mimic Python’s mapping protocol. For the special case of array tables, Lua automatically inserts integer indices as keys into the table. Therefore, indexing starts from 1 as in Lua instead of 0 as in Python. For the same reason, negative indexing does not work. It is best to think of Lua tables as mappings rather than arrays, even for plain array tables.

>>> table = lua.eval('{10,20,30,40}')
>>> table[1]
10
>>> table[4]
40
>>> list(table)
[1, 2, 3, 4]
>>> dict(table)
{1: 10, 2: 20, 3: 30, 4: 40}
>>> list(table.values())
[10, 20, 30, 40]
>>> len(table)
4

>>> mapping = lua.eval('{ [1] = -1 }')
>>> list(mapping)
[1]

>>> mapping = lua.eval('{ [20] = -20; [3] = -3 }')
>>> mapping[20]
-20
>>> mapping[3]
-3
>>> sorted(mapping.values())
[-20, -3]
>>> sorted(mapping.items())
[(3, -3), (20, -20)]

>>> mapping[-3] = 3     # -3 used as key, not index!
>>> mapping[-3]
3
>>> sorted(mapping)
[-3, 3, 20]
>>> sorted(mapping.items())
[(-3, 3), (3, -3), (20, -20)]

To simplify the table creation from Python, the LuaRuntime comes with a helper method that creates a Lua table from Python arguments:

>>> t = lua.table(10, 20, 30, 40)
>>> lupa.lua_type(t)
'table'
>>> list(t)
[1, 2, 3, 4]
>>> list(t.values())
[10, 20, 30, 40]

>>> t = lua.table(10, 20, 30, 40, a=1, b=2)
>>> t[3]
30
>>> t['b']
2

A second helper method, .table_from(), was added in Lupa 1.1 and accepts any number of mappings and sequences/iterables as arguments. It collects all values and key-value pairs and builds a single Lua table from them. Any keys that appear in multiple mappings get overwritten with their last value (going from left to right).

>>> t = lua.table_from([10, 20, 30], {'a': 11, 'b': 22}, (40, 50), {'b': 42})
>>> t['a']
11
>>> t['b']
42
>>> t[5]
50
>>> sorted(t.values())
[10, 11, 20, 30, 40, 42, 50]

Since Lupa 2.1, passing recursive=True will map data structures recursively to Lua tables.

>>> t = lua.table_from(
...     [
...         # t1:
...         [
...             [10, 20, 30],
...             {'a': 11, 'b': 22}
...         ],
...         # t2:
...         [
...             (40, 50),
...             {'b': 42}
...         ]
...     ],
...     recursive=True
... )
>>> t1, t2 = t.values()
>>> list(t1[1].values())
[10, 20, 30]
>>> t1[2]['a']
11
>>> t1[2]['b']
22
>>> t2[2]['b']
42
>>> list(t1[1].values())
[10, 20, 30]
>>> list(t2[1].values())
[40, 50]

A lookup of non-existing keys or indices returns None (actually nil inside of Lua). A lookup is therefore more similar to the .get() method of Python dicts than to a mapping lookup in Python.

>>> table = lua.table(10, 20, 30, 40)
>>> table[1000000] is None
True
>>> table['no such key'] is None
True

>>> mapping = lua.eval('{ [20] = -20; [3] = -3 }')
>>> mapping['no such key'] is None
True

Note that len() does the right thing for array tables but does not work on mappings:

>>> len(table)
4
>>> len(mapping)
0

This is because len() is based on the # (length) operator in Lua and because of the way Lua defines the length of a table. Remember that unset table indices always return nil, including indices outside of the table size. Thus, Lua basically looks for an index that returns nil and returns the index before that. This works well for array tables that do not contain nil values, gives barely predictable results for tables with ‘holes’ and does not work at all for mapping tables. For tables with both sequential and mapping content, this ignores the mapping part completely.

Note that it is best not to rely on the behaviour of len() for mappings. It might change in a later version of Lupa.

Similar to the table interface provided by Lua, Lupa also supports attribute access to table members:

>>> table = lua.eval('{ a=1, b=2 }')
>>> table.a, table.b
(1, 2)
>>> table.a == table['a']
True

This enables access to Lua ‘methods’ that are associated with a table, as used by the standard library modules:

>>> string = lua.eval('string')    # get the 'string' library table
>>> print( string.lower('A') )
a

Python Callables

As discussed earlier, Lupa allows Lua scripts to call Python functions and methods:

>>> def add_one(num):
...     return num + 1
>>> lua_func = lua.eval('function(num, py_func) return py_func(num) end')
>>> lua_func(48, add_one)
49

>>> class MyClass():
...     def my_method(self):
...         return 345
>>> obj = MyClass()
>>> lua_func = lua.eval('function(py_obj) return py_obj:my_method() end')
>>> lua_func(obj)
345

Lua doesn’t have a dedicated syntax for named arguments, so by default Python callables can only be called using positional arguments.

A common pattern for implementing named arguments in Lua is passing them in a table as the first and only function argument. See http://lua-users.org/wiki/NamedParameters for more details. Lupa supports this pattern by providing two decorators: lupa.unpacks_lua_table for Python functions and lupa.unpacks_lua_table_method for methods of Python objects.

Python functions/methods wrapped in these decorators can be called from Lua code as func(foo, bar), func{foo=foo, bar=bar} or func{foo, bar=bar}. Example:

>>> @lupa.unpacks_lua_table
... def add(a, b):
...     return a + b
>>> lua_func = lua.eval('function(a, b, py_func) return py_func{a=a, b=b} end')
>>> lua_func(5, 6, add)
11
>>> lua_func = lua.eval('function(a, b, py_func) return py_func{a, b=b} end')
>>> lua_func(5, 6, add)
11

If you do not control the function implementation, you can also just manually wrap a callable object when passing it into Lupa:

>>> import operator
>>> wrapped_py_add = lupa.unpacks_lua_table(operator.add)

>>> lua_func = lua.eval('function(a, b, py_func) return py_func{a, b} end')
>>> lua_func(5, 6, wrapped_py_add)
11

There are some limitations:

  1. Avoid using lupa.unpacks_lua_table and lupa.unpacks_lua_table_method for functions where the first argument can be a Lua table. In this case py_func{foo=bar} (which is the same as py_func({foo=bar}) in Lua) becomes ambiguous: it could mean either “call py_func with a named foo argument” or “call py_func with a positional {foo=bar} argument”.

  2. One should be careful with passing nil values to callables wrapped in lupa.unpacks_lua_table or lupa.unpacks_lua_table_method decorators. Depending on the context, passing nil as a parameter can mean either “omit a parameter” or “pass None”. This even depends on the Lua version.

    It is possible to use python.none instead of nil to pass None values robustly. Arguments with nil values are also fine when standard braces func(a, b, c) syntax is used.

Because of these limitations lupa doesn’t enable named arguments for all Python callables automatically. Decorators allow to enable named arguments on a per-callable basis.

Lua Coroutines

The next is an example of Lua coroutines. A wrapped Lua coroutine behaves exactly like a Python coroutine. It needs to get created at the beginning, either by using the .coroutine() method of a function or by creating it in Lua code. Then, values can be sent into it using the .send() method or it can be iterated over. Note that the .throw() method is not supported, though.

>>> lua_code = '''\
...     function(N)
...         for i=0,N do
...             coroutine.yield( i%2 )
...         end
...     end
... '''
>>> lua = LuaRuntime()
>>> f = lua.eval(lua_code)

>>> gen = f.coroutine(4)
>>> list(enumerate(gen))
[(0, 0), (1, 1), (2, 0), (3, 1), (4, 0)]

An example where values are passed into the coroutine using its .send() method:

>>> lua_code = '''\
...     function()
...         local t,i = {},0
...         local value = coroutine.yield()
...         while value do
...             t[i] = value
...             i = i + 1
...             value = coroutine.yield()
...         end
...         return t
...     end
... '''
>>> f = lua.eval(lua_code)

>>> co = f.coroutine()   # create coroutine
>>> co.send(None)        # start coroutine (stops at first yield)

>>> for i in range(3):
...     co.send(i*2)

>>> mapping = co.send(None)   # loop termination signal
>>> sorted(mapping.items())
[(0, 0), (1, 2), (2, 4)]

It also works to create coroutines in Lua and to pass them back into Python space:

>>> lua_code = '''\
...   function f(N)
...         for i=0,N do
...             coroutine.yield( i%2 )
...         end
...   end ;
...   co1 = coroutine.create(f) ;
...   co2 = coroutine.create(f) ;
...
...   status, first_result = coroutine.resume(co2, 2) ;   -- starting!
...
...   return f, co1, co2, status, first_result
... '''

>>> lua = LuaRuntime()
>>> f, co, lua_gen, status, first_result = lua.execute(lua_code)

>>> # a running coroutine:

>>> status
True
>>> first_result
0
>>> list(lua_gen)
[1, 0]
>>> list(lua_gen)
[]

>>> # an uninitialised coroutine:

>>> gen = co(4)
>>> list(enumerate(gen))
[(0, 0), (1, 1), (2, 0), (3, 1), (4, 0)]

>>> gen = co(2)
>>> list(enumerate(gen))
[(0, 0), (1, 1), (2, 0)]

>>> # a plain function:

>>> gen = f.coroutine(4)
>>> list(enumerate(gen))
[(0, 0), (1, 1), (2, 0), (3, 1), (4, 0)]

Threading

The following example calculates a mandelbrot image in parallel threads and displays the result in PIL. It is based on a benchmark implementation for the Computer Language Benchmarks Game.

lua_code = '''\
    function(N, i, total)
        local char, unpack = string.char, table.unpack
        local result = ""
        local M, ba, bb, buf = 2/N, 2^(N%8+1)-1, 2^(8-N%8), {}
        local start_line, end_line = N/total * (i-1), N/total * i - 1
        for y=start_line,end_line do
            local Ci, b, p = y*M-1, 1, 0
            for x=0,N-1 do
                local Cr = x*M-1.5
                local Zr, Zi, Zrq, Ziq = Cr, Ci, Cr*Cr, Ci*Ci
                b = b + b
                for i=1,49 do
                    Zi = Zr*Zi*2 + Ci
                    Zr = Zrq-Ziq + Cr
                    Ziq = Zi*Zi
                    Zrq = Zr*Zr
                    if Zrq+Ziq > 4.0 then b = b + 1; break; end
                end
                if b >= 256 then p = p + 1; buf[p] = 511 - b; b = 1; end
            end
            if b ~= 1 then p = p + 1; buf[p] = (ba-b)*bb; end
            result = result .. char(unpack(buf, 1, p))
        end
        return result
    end
'''

image_size = 1280   # == 1280 x 1280
thread_count = 8

from lupa import LuaRuntime
lua_funcs = [ LuaRuntime(encoding=None).eval(lua_code)
              for _ in range(thread_count) ]

results = [None] * thread_count
def mandelbrot(i, lua_func):
    results[i] = lua_func(image_size, i+1, thread_count)

import threading
threads = [ threading.Thread(target=mandelbrot, args=(i,lua_func))
            for i, lua_func in enumerate(lua_funcs) ]
for thread in threads:
    thread.start()
for thread in threads:
    thread.join()

result_buffer = b''.join(results)

# use Pillow to display the image
from PIL import Image
image = Image.frombytes('1', (image_size, image_size), result_buffer)
image.show()

Note how the example creates a separate LuaRuntime for each thread to enable parallel execution. Each LuaRuntime is protected by a global lock that prevents concurrent access to it. The low memory footprint of Lua makes it reasonable to use multiple runtimes, but this setup also means that values cannot easily be exchanged between threads inside of Lua. They must either get copied through Python space (passing table references will not work, either) or use some Lua mechanism for explicit communication, such as a pipe or some kind of shared memory setup.

Restricting Lua access to Python objects

Lupa provides a simple mechanism to control access to Python objects. Each attribute access can be passed through a filter function as follows:

>>> def filter_attribute_access(obj, attr_name, is_setting):
...     if isinstance(attr_name, unicode):
...         if not attr_name.startswith('_'):
...             return attr_name
...     raise AttributeError('access denied')

>>> lua = lupa.LuaRuntime(
...           register_eval=False,
...           attribute_filter=filter_attribute_access)
>>> func = lua.eval('function(x) return x.__class__ end')
>>> func(lua)
Traceback (most recent call last):
 ...
AttributeError: access denied

The is_setting flag indicates whether the attribute is being read or set.

Note that the attributes of Python functions provide access to the current globals() and therefore to the builtins etc. If you want to safely restrict access to a known set of Python objects, it is best to work with a whitelist of safe attribute names. One way to do that could be to use a well selected list of dedicated API objects that you provide to Lua code, and to only allow Python attribute access to the set of public attribute/method names of these objects.

Since Lupa 1.0, you can alternatively provide dedicated getter and setter function implementations for a LuaRuntime:

>>> def getter(obj, attr_name):
...     if attr_name == 'yes':
...         return getattr(obj, attr_name)
...     raise AttributeError(
...         'not allowed to read attribute "%s"' % attr_name)

>>> def setter(obj, attr_name, value):
...     if attr_name == 'put':
...         setattr(obj, attr_name, value)
...         return
...     raise AttributeError(
...         'not allowed to write attribute "%s"' % attr_name)

>>> class X(object):
...     yes = 123
...     put = 'abc'
...     noway = 2.1

>>> x = X()

>>> lua = lupa.LuaRuntime(attribute_handlers=(getter, setter))
>>> func = lua.eval('function(x) return x.yes end')
>>> func(x)  # getting 'yes'
123
>>> func = lua.eval('function(x) x.put = "ABC"; end')
>>> func(x)  # setting 'put'
>>> print(x.put)
ABC
>>> func = lua.eval('function(x) x.noway = 42; end')
>>> func(x)  # setting 'noway'
Traceback (most recent call last):
 ...
AttributeError: not allowed to write attribute "noway"

Restricting Lua Memory Usage

Lupa provides a simple mechanism to control the maximum memory usage of the Lua Runtime since version 2.0. By default Lupa does not interfere with Lua’s memory allocation, to opt-in you must set the max_memory when creating the LuaRuntime.

The LuaRuntime provides three methods for controlling and reading the memory usage:

  1. get_memory_used(total=False) to get the current memory usage of the LuaRuntime.

  2. get_max_memory(total=False) to get the current memory limit. 0 means there is no memory limitation.

  3. set_max_memory(max_memory, total=False) to change the memory limit. Values below or equal to 0 mean no limit.

There is always some memory used by the LuaRuntime itself (around ~20KiB, depending on your lua version and other factors) which is excluded from all calculations unless you specify total=True.

>>> from lupa import lua52
>>> lua = lua52.LuaRuntime(max_memory=0)  # 0 for unlimited, default is None
>>> lua.get_memory_used()  # memory used by your code
0
>>> total_lua_memory = lua.get_memory_used(total=True)  # includes memory used by the runtime itself
>>> assert total_lua_memory > 0  # exact amount depends on your lua version and other factors

Lua code hitting the memory limit will receive memory errors:

>>> lua.set_max_memory(100)
>>> lua.eval("string.rep('a', 1000)")   # doctest: +IGNORE_EXCEPTION_DETAIL
Traceback (most recent call last):
 ...
lupa.LuaMemoryError: not enough memory

LuaMemoryError inherits from LuaError and MemoryError.

Importing Lua binary modules

This will usually work as is, but here are the details, in case anything goes wrong for you.

To use binary modules in Lua, you need to compile them against the header files of the LuaJIT sources that you used to build Lupa, but do not link them against the LuaJIT library.

Furthermore, CPython needs to enable global symbol visibility for shared libraries before loading the Lupa module. This can be done by calling sys.setdlopenflags(flag_values). Importing the lupa module will automatically try to set up the correct dlopen flags if it can find the platform specific DLFCN Python module that defines the necessary flag constants. In that case, using binary modules in Lua should work out of the box.

If this setup fails, however, you have to set the flags manually. When using the above configuration call, the argument flag_values must represent the sum of your system’s values for RTLD_NEW and RTLD_GLOBAL. If RTLD_NEW is 2 and RTLD_GLOBAL is 256, you need to call sys.setdlopenflags(258).

Assuming that the Lua luaposix (posix) module is available, the following should work on a Linux system:

>>> import sys
>>> orig_dlflags = sys.getdlopenflags()
>>> sys.setdlopenflags(258)
>>> import lupa
>>> sys.setdlopenflags(orig_dlflags)

>>> lua = lupa.LuaRuntime()
>>> posix_module = lua.require('posix')     # doctest: +SKIP

Building with different Lua versions

The build is configured to automatically search for an installed version of first LuaJIT and then Lua, and failing to find either, to use the bundled LuaJIT or Lua version.

If you wish to build Lupa with a specific version of Lua, you can configure the following options on setup:

Option

Description

--lua-lib <libfile>

Lua library file path, e.g. --lua-lib /usr/local/lib/lualib.a

--lua-includes <incdir>

Lua include directory, e.g. --lua-includes /usr/local/include

--use-bundle

Use bundled LuaJIT or Lua instead of searching for an installed version.

--no-bundle

Don’t use the bundled LuaJIT/Lua, search for an installed version of LuaJIT or Lua, e.g. using pkg-config.

--no-lua-jit

Don’t use or search for LuaJIT, only use or search Lua instead.

Installing lupa

Building with LuaJIT2

  1. Download and unpack lupa

    http://pypi.python.org/pypi/lupa

  2. Download LuaJIT2

    http://luajit.org/download.html

  3. Unpack the archive into the lupa base directory, e.g.:

    .../lupa-0.1/LuaJIT-2.0.2
  4. Build LuaJIT:

    cd LuaJIT-2.0.2
    make
    cd ..

    If you need specific C compiler flags, pass them to make as follows:

    make CFLAGS="..."

    For trickier target platforms like Windows and MacOS-X, please see the official installation instructions for LuaJIT.

    NOTE: When building on Windows, make sure that lua51.lib is made in addition to lua51.dll. The MSVC build produces this file, MinGW does NOT.

  5. Build lupa:

    python setup.py build_ext -i

    Or any other distutils target of your choice, such as build or one of the bdist targets. See the distutils documentation for help, also the hints on building extension modules.

    Note that on 64bit MacOS-X installations, the following additional compiler flags are reportedly required due to the embedded LuaJIT:

    -pagezero_size 10000 -image_base 100000000

    You can find additional installation hints for MacOS-X in this somewhat unclear blog post, which may or may not tell you at which point in the installation process to provide these flags.

    Also, on 64bit MacOS-X, you will typically have to set the environment variable ARCHFLAGS to make sure it only builds for your system instead of trying to generate a fat binary with both 32bit and 64bit support:

    export ARCHFLAGS="-arch x86_64"

    Note that this applies to both LuaJIT and Lupa, so make sure you try a clean build of everything if you forgot to set it initially.

Building with Lua 5.x

It also works to use Lupa with the standard (non-JIT) Lua runtime. The easiest way is to use the bundled lua submodule:

  1. Clone the submodule:

    $ git submodule update --init third-party/lua
  2. Build Lupa:

    $ python3 setup.py bdist_wheel --use-bundle --with-cython

You can also build it by installing a Lua 5.x package, including any development packages (header files etc.). On systems that use the “pkg-config” configuration mechanism, Lupa’s setup.py will pick up either LuaJIT2 or Lua automatically, with a preference for LuaJIT2 if it is found. Pass the --no-luajit option to the setup.py script if you have both installed but do not want to use LuaJIT2.

On other systems, you may have to supply the build parameters externally, e.g. using environment variables or by changing the setup.py script manually. Pass the --no-luajit option to the setup.py script in order to ignore the failure you get when neither LuaJIT2 nor Lua are found automatically.

For further information, read this mailing list post:

https://www.freelists.org/post/lupa-dev/Lupa-with-normal-Lua-interpreter-Lua-51,2

Installing lupa from packages

Debian/Ubuntu + Lua 5.2

  1. Install Lua 5.2 development package:

    $ apt-get install liblua5.2-dev
  2. Install lupa:

    $ pip install lupa

Debian/Ubuntu + LuaJIT2

  1. Install LuaJIT2 development package:

    $ apt-get install libluajit-5.1-dev
  2. Install lupa:

    $ pip install lupa

Depending on OS version, you might get an older LuaJIT2 version.

OS X + Lua 5.2 + Homebrew

  1. Install Lua:

    $ brew install lua
  2. Install pkg-config:

    $ brew install pkg-config
  3. Install lupa:

    $ pip install lupa

Project details


Release history Release notifications | RSS feed

This version

2.2

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lupapy-2.2.tar.gz (7.1 MB view details)

Uploaded Source

Built Distributions

lupapy-2.2-pp310-pypy310_pp73-win_amd64.whl (1.7 MB view details)

Uploaded PyPy Windows x86-64

lupapy-2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

lupapy-2.2-pp310-pypy310_pp73-macosx_11_0_x86_64.whl (832.6 kB view details)

Uploaded PyPy macOS 11.0+ x86-64

lupapy-2.2-pp39-pypy39_pp73-win_amd64.whl (1.7 MB view details)

Uploaded PyPy Windows x86-64

lupapy-2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

lupapy-2.2-pp39-pypy39_pp73-macosx_11_0_x86_64.whl (831.6 kB view details)

Uploaded PyPy macOS 11.0+ x86-64

lupapy-2.2-pp38-pypy38_pp73-win_amd64.whl (1.7 MB view details)

Uploaded PyPy Windows x86-64

lupapy-2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

lupapy-2.2-pp38-pypy38_pp73-macosx_11_0_x86_64.whl (833.1 kB view details)

Uploaded PyPy macOS 11.0+ x86-64

lupapy-2.2-pp37-pypy37_pp73-win_amd64.whl (1.7 MB view details)

Uploaded PyPy Windows x86-64

lupapy-2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

lupapy-2.2-pp37-pypy37_pp73-macosx_11_0_x86_64.whl (833.0 kB view details)

Uploaded PyPy macOS 11.0+ x86-64

lupapy-2.2-cp313-cp313-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.13 Windows x86-64

lupapy-2.2-cp313-cp313-win32.whl (1.5 MB view details)

Uploaded CPython 3.13 Windows x86

lupapy-2.2-cp313-cp313-musllinux_1_2_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ x86-64

lupapy-2.2-cp313-cp313-musllinux_1_2_i686.whl (1.2 MB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ i686

lupapy-2.2-cp313-cp313-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ ARM64

lupapy-2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

lupapy-2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ARM64

lupapy-2.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.1 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

lupapy-2.2-cp313-cp313-macosx_11_0_x86_64.whl (988.4 kB view details)

Uploaded CPython 3.13 macOS 11.0+ x86-64

lupapy-2.2-cp313-cp313-macosx_11_0_universal2.whl (1.9 MB view details)

Uploaded CPython 3.13 macOS 11.0+ universal2 (ARM64, x86-64)

lupapy-2.2-cp313-cp313-macosx_11_0_arm64.whl (926.4 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

lupapy-2.2-cp312-cp312-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.12 Windows x86-64

lupapy-2.2-cp312-cp312-win32.whl (1.4 MB view details)

Uploaded CPython 3.12 Windows x86

lupapy-2.2-cp312-cp312-musllinux_1_2_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

lupapy-2.2-cp312-cp312-musllinux_1_2_i686.whl (1.2 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ i686

lupapy-2.2-cp312-cp312-musllinux_1_2_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ ARM64

lupapy-2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

lupapy-2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

lupapy-2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.1 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

lupapy-2.2-cp312-cp312-macosx_11_0_x86_64.whl (991.3 kB view details)

Uploaded CPython 3.12 macOS 11.0+ x86-64

lupapy-2.2-cp312-cp312-macosx_11_0_universal2.whl (1.9 MB view details)

Uploaded CPython 3.12 macOS 11.0+ universal2 (ARM64, x86-64)

lupapy-2.2-cp312-cp312-macosx_11_0_arm64.whl (927.7 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

lupapy-2.2-cp311-cp311-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.11 Windows x86-64

lupapy-2.2-cp311-cp311-win32.whl (1.4 MB view details)

Uploaded CPython 3.11 Windows x86

lupapy-2.2-cp311-cp311-musllinux_1_2_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

lupapy-2.2-cp311-cp311-musllinux_1_2_i686.whl (1.2 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ i686

lupapy-2.2-cp311-cp311-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ ARM64

lupapy-2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

lupapy-2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

lupapy-2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.2 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

lupapy-2.2-cp311-cp311-macosx_11_0_x86_64.whl (981.2 kB view details)

Uploaded CPython 3.11 macOS 11.0+ x86-64

lupapy-2.2-cp311-cp311-macosx_11_0_universal2.whl (1.9 MB view details)

Uploaded CPython 3.11 macOS 11.0+ universal2 (ARM64, x86-64)

lupapy-2.2-cp311-cp311-macosx_11_0_arm64.whl (923.7 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

lupapy-2.2-cp310-cp310-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.10 Windows x86-64

lupapy-2.2-cp310-cp310-win32.whl (1.4 MB view details)

Uploaded CPython 3.10 Windows x86

lupapy-2.2-cp310-cp310-musllinux_1_2_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

lupapy-2.2-cp310-cp310-musllinux_1_2_i686.whl (1.2 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ i686

lupapy-2.2-cp310-cp310-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ ARM64

lupapy-2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

lupapy-2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

lupapy-2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.2 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

lupapy-2.2-cp310-cp310-macosx_11_0_x86_64.whl (976.6 kB view details)

Uploaded CPython 3.10 macOS 11.0+ x86-64

lupapy-2.2-cp310-cp310-macosx_11_0_universal2.whl (1.9 MB view details)

Uploaded CPython 3.10 macOS 11.0+ universal2 (ARM64, x86-64)

lupapy-2.2-cp310-cp310-macosx_11_0_arm64.whl (920.0 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

lupapy-2.2-cp39-cp39-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.9 Windows x86-64

lupapy-2.2-cp39-cp39-win32.whl (1.4 MB view details)

Uploaded CPython 3.9 Windows x86

lupapy-2.2-cp39-cp39-musllinux_1_2_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ x86-64

lupapy-2.2-cp39-cp39-musllinux_1_2_i686.whl (1.2 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ i686

lupapy-2.2-cp39-cp39-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ ARM64

lupapy-2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

lupapy-2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

lupapy-2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.2 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

lupapy-2.2-cp39-cp39-macosx_11_0_x86_64.whl (977.5 kB view details)

Uploaded CPython 3.9 macOS 11.0+ x86-64

lupapy-2.2-cp39-cp39-macosx_11_0_universal2.whl (1.9 MB view details)

Uploaded CPython 3.9 macOS 11.0+ universal2 (ARM64, x86-64)

lupapy-2.2-cp39-cp39-macosx_11_0_arm64.whl (920.9 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

lupapy-2.2-cp38-cp38-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.8 Windows x86-64

lupapy-2.2-cp38-cp38-win32.whl (1.4 MB view details)

Uploaded CPython 3.8 Windows x86

lupapy-2.2-cp38-cp38-musllinux_1_2_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.2+ x86-64

lupapy-2.2-cp38-cp38-musllinux_1_2_i686.whl (1.2 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.2+ i686

lupapy-2.2-cp38-cp38-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.2+ ARM64

lupapy-2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

lupapy-2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

lupapy-2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.2 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

lupapy-2.2-cp38-cp38-macosx_11_0_x86_64.whl (974.7 kB view details)

Uploaded CPython 3.8 macOS 11.0+ x86-64

lupapy-2.2-cp38-cp38-macosx_11_0_arm64.whl (919.8 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

lupapy-2.2-cp37-cp37m-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.7m Windows x86-64

lupapy-2.2-cp37-cp37m-win32.whl (1.4 MB view details)

Uploaded CPython 3.7m Windows x86

lupapy-2.2-cp37-cp37m-musllinux_1_2_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.7m musllinux: musl 1.2+ x86-64

lupapy-2.2-cp37-cp37m-musllinux_1_2_i686.whl (1.2 MB view details)

Uploaded CPython 3.7m musllinux: musl 1.2+ i686

lupapy-2.2-cp37-cp37m-musllinux_1_2_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.7m musllinux: musl 1.2+ ARM64

lupapy-2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

lupapy-2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

lupapy-2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.1 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

lupapy-2.2-cp37-cp37m-macosx_11_0_x86_64.whl (962.8 kB view details)

Uploaded CPython 3.7m macOS 11.0+ x86-64

lupapy-2.2-cp36-cp36m-win_amd64.whl (1.9 MB view details)

Uploaded CPython 3.6m Windows x86-64

lupapy-2.2-cp36-cp36m-win32.whl (1.5 MB view details)

Uploaded CPython 3.6m Windows x86

lupapy-2.2-cp36-cp36m-musllinux_1_2_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.6m musllinux: musl 1.2+ x86-64

lupapy-2.2-cp36-cp36m-musllinux_1_2_i686.whl (1.2 MB view details)

Uploaded CPython 3.6m musllinux: musl 1.2+ i686

lupapy-2.2-cp36-cp36m-musllinux_1_2_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.6m musllinux: musl 1.2+ ARM64

lupapy-2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64

lupapy-2.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.6m manylinux: glibc 2.17+ ARM64

lupapy-2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.1 MB view details)

Uploaded CPython 3.6m manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

File details

Details for the file lupapy-2.2.tar.gz.

File metadata

  • Download URL: lupapy-2.2.tar.gz
  • Upload date:
  • Size: 7.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2.tar.gz
Algorithm Hash digest
SHA256 a44d7a5d6a484e90000cfd19f5d9fba3b8882c355679c220c79d7b04cf7d4808
MD5 8fa55005399a61aa96b7ec7e82d0bb07
BLAKE2b-256 8f329431994b3c9e314c0eee901adf87aea03abf6a95cd81e244afe44956b554

See more details on using hashes here.

File details

Details for the file lupapy-2.2-pp310-pypy310_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-pp310-pypy310_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 d1ce0cc605168b91f513cf7b1f24504cec614df90eb3c10e8356daac176a18a6
MD5 a9617a205ca708ca3f7f62019cefcdd0
BLAKE2b-256 6c76a6586676a3ee8af442c7f5d4c2964f895c2e4dcf062ed3163b324e20c6ef

See more details on using hashes here.

File details

Details for the file lupapy-2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 65cecbcdb48d3bb1431c23fd130edffea973b337a7337045ec1aef3b79efadb2
MD5 19dc5b7446821d212179a2fca1d0ecef
BLAKE2b-256 2a081a7bdefd2df7b21a746882d1a4ef9a47a651e423b27bd17c62fe659f41a7

See more details on using hashes here.

File details

Details for the file lupapy-2.2-pp310-pypy310_pp73-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-pp310-pypy310_pp73-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 68aa9a364b9cd8a85d9b3d77af9c68722ad2c2f6afa1224a218a9f9f058b89b8
MD5 704a75a1a7356846756ae8f15c878549
BLAKE2b-256 113a46cc93db5592ac3cf8a0cc9303ac87fd420be00156a98151442793f2dd1e

See more details on using hashes here.

File details

Details for the file lupapy-2.2-pp39-pypy39_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-pp39-pypy39_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 7fbd49fb73e6a0a7881a5e0f6dd42e8680a5a05e92d050a5390a4dd60406ce76
MD5 bf4bd9c7a872d5ca09eeec6182cc9632
BLAKE2b-256 8366240bbc30670a5117d6a302c2b046efa14ccbe0b8e01f67109d54978b2b0d

See more details on using hashes here.

File details

Details for the file lupapy-2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9087a03bda3cfcb804547609bdd57e96879f7f40bee5151b099154619ea427c4
MD5 7f6d7d9775d505f0ce73b73aa5d1c1a8
BLAKE2b-256 b2d2fa075fab3875282cbb951997be197723668cf272de3878881acd647f5b72

See more details on using hashes here.

File details

Details for the file lupapy-2.2-pp39-pypy39_pp73-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-pp39-pypy39_pp73-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 36d73a284fbf82782f6b713b9ff975ea2f262a23995ab905bad43668b5118952
MD5 297fc35e04d49373cfd17e42cec22426
BLAKE2b-256 e5b7addb8c85826bb5dc2e3a6f3b88c7fbce804a59ea5e500ff7a3a512076f97

See more details on using hashes here.

File details

Details for the file lupapy-2.2-pp38-pypy38_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-pp38-pypy38_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 e83892ef162d2f5b415aa7e95ca9c7bdfbb222e537b922ec4b8498088e9fe42b
MD5 66c3a890b0ece3a8950d250a9846efa7
BLAKE2b-256 2986c20815754fa7ef23219c01e3a12fe5a93abcf22b35c5ae20da1faeab4f45

See more details on using hashes here.

File details

Details for the file lupapy-2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c2110aa77188434ac39b3c5a1b8a3fea9bb4e56135fb07524af44b8e4b036b71
MD5 a4bb1dc40775bd3cd9a33722339021f8
BLAKE2b-256 398b2746e9b290f71da2ad9cdecdf4ec5ba0f129435236d0d87a0158fdae1f5b

See more details on using hashes here.

File details

Details for the file lupapy-2.2-pp38-pypy38_pp73-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-pp38-pypy38_pp73-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 62efcb5529c6fa9a8cc9dfc1b61347410b5ae89ad0a5780add99a7c62df0715d
MD5 a46a9d353649f59941a474ce3f7ae0fc
BLAKE2b-256 9c7f2b6f52239ddb3a4675b1993323ab2f9784d4a4da79959a959657d54543ac

See more details on using hashes here.

File details

Details for the file lupapy-2.2-pp37-pypy37_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-pp37-pypy37_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 9effa37716979a7e1201eaca5e0888032e054568f99ab01b2837dabb6f5c3040
MD5 f3dba255bfb9f17783e47b9584200e80
BLAKE2b-256 c8070efbfe5ca952075f04d340bcd7e0cba1bd4f599dc2132f9e32319ff44593

See more details on using hashes here.

File details

Details for the file lupapy-2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ab90af19f885895c9bc77122bbc417b7af3a05a0d62ae881d6f519d0882744df
MD5 a239e0f23c895ff5e438f041c727bc9e
BLAKE2b-256 a5cfee5643dd04d0040833c20c68f3abebb92711f91db72d46869ae4224579ea

See more details on using hashes here.

File details

Details for the file lupapy-2.2-pp37-pypy37_pp73-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-pp37-pypy37_pp73-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 1ae1a9b02a776621915ab19d08f483b2be17070d76e7a70f3579ad164051ebb3
MD5 4b2c96ee7197fcabffd92df1abb4f472
BLAKE2b-256 1f3c4d270bf4adc6359427e9fd43ce4f193af29b0fa4ccaad1662cd7a3b6edf1

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: lupapy-2.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c5e75d6de894cbe27e865492ba1bf3109c369fb9036256dbcfaf6b12b5976bb6
MD5 4e793ca2c73697bf9ca838516e927011
BLAKE2b-256 11fd135d560931acfa60d59b294707b3a73b1df9089f616e5b1a35647c806585

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp313-cp313-win32.whl.

File metadata

  • Download URL: lupapy-2.2-cp313-cp313-win32.whl
  • Upload date:
  • Size: 1.5 MB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 6e16ca0f7ce452e6171e4c00a070a8334a0b12957b922427c56f4abe31b366a5
MD5 ef3e2ba2e6c0c9cf332f1d6bb27f3d68
BLAKE2b-256 ae6996f8c808054e14863247184c9d58a3e4e0d223ff37d6b24b88f5cd1af4f7

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e3036e730559363f045c4b9897007e441685ac7b3ac6184d91c826a9cfe2d635
MD5 6a341559948c39045deb7d1eb6d49cb5
BLAKE2b-256 d37e43e899990738d9b7b0fcb75748770444aeb585361a7fab2989303a574c6d

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp313-cp313-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 84286812e3102758f736f9c7529cae1303c546a1bda9ad847e9d629d9d2f2ba0
MD5 0074cc543d2dfee7126009e4bfb87cae
BLAKE2b-256 54dad10cf7c53b05735e21070f9126261444cec4f495e25d301d62be80a7b989

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 4e2a32b39a56e6044faac1fcd81db9587df1741e81b890cc30a1be0f0b3fa355
MD5 b40d43908fc81541ac1eb8ec2688c769
BLAKE2b-256 015257da27be73725ad4fb09418b8718570b03030f45eb22e6bb4b385449ea7e

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4e5ba489ac707db3b26095ee7fa3334ac137abccc82332cfeb0e610eead68ae5
MD5 aed39ea411a31a4604ae322ec7c847f4
BLAKE2b-256 95e594bafe95695209d2fe6d2ff1cd23a89c8d582bd72216d9c4cb4a50844791

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 119b6f12cb157dc9392ba9f38e0eaa068a33d306e2f2e3ec091c211aa5f647cb
MD5 4a66f4a3efc5425aaed5838467493312
BLAKE2b-256 00cb25e1eea2166c01d4f44ccdcb01793a30b13cfb7e253e6af8f7de7e316e8f

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 2fe3350aa607d6e706236307d1b8dbc50d81bf322bf20b8f4fa85258f1a76834
MD5 9f5ffb17d8b853f1d979e19a77aabd52
BLAKE2b-256 af4f047079933871ea23b99ee17b13818b4dba1adeee56f3b04313e15b8d38da

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp313-cp313-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 a41fcde865069c166cb0c74b522a5a28829d9c8da618590121400acdeb9239bf
MD5 7c0532c846ae3293ec52bc97c1c593b0
BLAKE2b-256 f27b50878044b10d39c36510a71210913255b0d3f9839419f19848240b907ace

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp313-cp313-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 e39186dd6cf7dd8dff05dc23f0f3b08a5235b3c8728f367f03fcdf8b856918e5
MD5 3bb29c564e917e472f019605e42a579a
BLAKE2b-256 df59ca1adc4a63f87f87834fbccfff07a3588e7edbb6598e0ee42d15e31eda27

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4f45f87ff5d82266b2a19cf32f0f18e4609c0774749759fd7b3d1b6b81df0351
MD5 525910fb87e2f9e76f1e3f3fe864c533
BLAKE2b-256 9eab9620cdd918d09cbe9448561f8413404d15c0e94f48f9374d2aaa762aea72

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: lupapy-2.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 29a932048efbe583797f98ae3e105f13e738fa8d92eecc90fd1471f291a85c90
MD5 eb0e088a6883d7eb027594315af41f05
BLAKE2b-256 bc98e4388d7d8fb15030e6d16de16e28e0a6567beca75117e83e088da95b34f8

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp312-cp312-win32.whl.

File metadata

  • Download URL: lupapy-2.2-cp312-cp312-win32.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 209a9964f78250b8b4565236286b3cb4e601133a563f448cf272502fa5a16378
MD5 0dfa67e6bb59bd6be9e32a24b5c205f3
BLAKE2b-256 2be5b58a478021927d3d7132f1e3966956dae69e25d0ce984ca79469ed293e5c

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c9760c37fc06439436beb97047bfdb53c5423d0a783eb2dbdeb7753d29452465
MD5 b7172b54f0ae613c990dd3d8d8ed9140
BLAKE2b-256 2898779f1fdbeab4655d32817eca934484939d8dfda97a8ad0cd445333cf5b35

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 0f2c7b7f35cbc6d0c7345fd7b99a0c9caa9ca443c8e2bdacbc0cfb5abedc42e1
MD5 226d76e6e086ccec44978b798222d689
BLAKE2b-256 9780a1eac3bac8da19009503aaad980e7ac87d70ed6481b37924d758c709ce33

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 753f36005b2935086bc596c52a9fc7920193d3cc1b59acebe731772557b49cbd
MD5 5dedc4d4c5410cbf21cbc3f7d329814e
BLAKE2b-256 05ac03983cb59712ea26110637be6a904108344fe2417d6ff8b2730d5de6b9d4

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f58c31e11d2a292d661fc861e030527c39d0d242f39a8246ce3e75781e475f73
MD5 c84585f3ed35a70b7da44507eff5acbc
BLAKE2b-256 55ac098986b3851bb01bbe9eb7c607ffc06231a58bf1154b3b7a5b1b798d9766

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 624c8dee572297b82aab5564ef2874a1d224336e775f913744e1160e918c549b
MD5 10c76ec5ff46c4e6afb09571eb9037b4
BLAKE2b-256 516e32a3a9082c738ce4106ab7f02acffef00f6cc93035feaacc48117a58c0df

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 8743a6b189df3e8136689681331c57b395849e7eb96e523c9ac8153f9258ba59
MD5 a9303de5836818f4e00e3c0c425a1ae5
BLAKE2b-256 358fadc2833825284c05caf9ce38587ac6eb89e21104677b09a19922367f2928

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp312-cp312-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 999cc73594b31ca8e4b90f9cc8b5795c6c77f86ddb55693aac7866895d0a9aa0
MD5 add50a4dd9533d6d60394b0c0dfb1ccf
BLAKE2b-256 6959c705c47a1ba6e80dfb7e7a33f2310c7277acdbec81dd8929b986d3d24da6

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp312-cp312-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 1b4d31b66cd5d2e2de57d7660c4ae67750c734537095264ed23fffcec7fb81dc
MD5 907339d0ccd1ca985a06e652d787b7a0
BLAKE2b-256 45c4a930b4cc715dc07a9f7f7e7cff773ec078d3bdfdf2fbddfa4d67ffd5277c

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a8663c8f41c860aa781765c4510a9504991e648854b77b435e404129038ad6b1
MD5 3867e930c49164838087eb343f240349
BLAKE2b-256 ee7b87e5444235558b8ff6b604eba71d248575ce040f1191f04a89455b79c1aa

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: lupapy-2.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 705abeaf9f8dba33bc2cbf71d078133882093fb2f86e5650c0a2085462366405
MD5 c0c3ba924fd80efdbb6c98452b5505b3
BLAKE2b-256 36ebfe12064e491ba3169599e130105c722177af037962044f5ce1184665cab7

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp311-cp311-win32.whl.

File metadata

  • Download URL: lupapy-2.2-cp311-cp311-win32.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 0f8bbd1fac055125536ad4d1df87646973eebb90544bb29c3b0e902785105f4e
MD5 b68081e2b675fdd24b30018f5d7dcbb6
BLAKE2b-256 10ad99116c8dea831d71ef7ba0ec960d5cc0ecd6d7a1f4072ee8137b8f2c69dc

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 eac7967d846c5fd81d846d9cc60c65e1b130f7057899781ae62a5ff3409ba52f
MD5 cded9797ee703b8c2d89a7f2c3d3518d
BLAKE2b-256 a8f45d96d4193f5eac9ed205d67b0851622db7e3536554401d462b31e97d244f

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp311-cp311-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 489d3d091b3f8f81e4f9849b04305adca5edb8fdf77ce3b3e205732469d7a532
MD5 91d92cbc1c178c63252182ad65ca823b
BLAKE2b-256 1073f88755a01bbe931cc87342b6d2a23f83603c33ffde894dffbbb910c51eb9

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 992f08aad0b9dda0b6d93499d35fa98bc8ec7631329cef9c3750f474e702ddb5
MD5 628824a0f6b10c5923dbb3996eea55b9
BLAKE2b-256 8310a5645d59d81a7063f7819d37a02c1f91d9ea34e76e42da8a947a2ff43f57

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 47f0401de5711cef69b571e85928a1393f3c270f2bfd9f51b1221a9610e1affc
MD5 a641eb9acefdb89db497d608bd7e978e
BLAKE2b-256 7e32c18d0737291bfe32e5bd85f3a704b2d05fde0e0a19cf66bbe90f08c5ee05

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c4e62c7edb4908d6d46084e8181572b528a6f4f46d088065a047f232e3494cb1
MD5 2d2585170c306e8f495ad17f16f9eaeb
BLAKE2b-256 2a65dc7900f97f6c8df53398c85368a3f2d0a74d2cc541c2d4a8fb3ad6496178

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c445c25e491f0f2f4eb6af6055b3ae62807b6f30fc0c3e876bb12107cc14e7be
MD5 e1cec7e016b0ca8b9c7f89673ba853b7
BLAKE2b-256 5846c928b24810240e1c16a887096f093e1cf4df188d80b25eaba0469f1521f0

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 517f79428684b590cb36e4b1fbdb8438285e6908360590f6dccf6387a1798519
MD5 d8693f8f07a8e72c629076f157b1e622
BLAKE2b-256 1e399f225c848d2a806076772c3cab94f25529557aabe0ef34ae5af132e0c37f

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp311-cp311-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 6769777d61ab579e2b103a3458f1b9b103dd2414510308ba72028f07ed453bbf
MD5 98a568f17eed26e8d75918a8f5f44419
BLAKE2b-256 73bafa941a72c5626d21127637929ba42c64826f679a54935c9de8de3b8ae6ba

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c2d72dc258cbcd9d026738c6ffd29265aac3cc0647b144c44e6febdf2bccae59
MD5 fb7f7f66811675880d19cabc36122da9
BLAKE2b-256 d5906188eccae514112d09793ee0498fa553d72523d8b1d56ec9a8b8aaf8d290

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: lupapy-2.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 ff28017fe20cb492cc144ea1f793876e03d1d7457175261e90781d39cb5222a5
MD5 c55fa16254c30700419a2860e2960ae0
BLAKE2b-256 41de1a887682f6a655b157a0e249b0ab6def72243f0d369d1644e1922cfd858a

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp310-cp310-win32.whl.

File metadata

  • Download URL: lupapy-2.2-cp310-cp310-win32.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 f69bc6c11e3c87706e2c7de3cd2f3ca3c47661d59d63b499ad5ce9fa1d8da1db
MD5 57ecf3af7d7511649d5c87cd250ed5af
BLAKE2b-256 7f2c38440b81990261d7a57b2d88d95b9c3f8f37a8257e541569bdf02149af01

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6013f1662ebe4ebb5eeffc0ecc38960101353d5eb2fd1f226b9377a674ba56d4
MD5 0622f09b1522d95f7def5ec9638cbc9f
BLAKE2b-256 0991882e01b133cfd09d7c0b5e5bd11110f6ae14712d868222d88420a674bf6e

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp310-cp310-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 6b3cf71d9297bb3c709cc73837f5d19cf781945770c29e00d1f5028b1c3db848
MD5 bf8eefba88b52c8322d1bb9edc12d86b
BLAKE2b-256 3ba643dc83acca0d34b7f2a2eb5d592aa6426f4a09317aa1ebbe37ab08f809d0

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 2734cb877654dab48de38429867d909b9f72be76219096f7a1d0ff4946319120
MD5 e634ff235c77e9274f3b7541ee5a5aaa
BLAKE2b-256 320330563aae8a107e09bcb59eb0fb2aa28aeb16fb60e7da69fd9bd5ff10fc78

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 baf78bb3e5244180e9f72dc8f723ed16c34c8e75a2b8893e5471d11ed6fe80a3
MD5 10628dfe5a0c905b542d92b783377be6
BLAKE2b-256 8efb5bb8cf8f47d6b530bf5c6b59d8d034d0e2c8a606b5f4b6a68f929fa17cc4

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4e9f659fa62c97b460a0d94723128cfe9667123f67fbf8db5c5044c1697e5a3e
MD5 c27a45247c6920d2646f2b463d13d503
BLAKE2b-256 1433177994e079fd7e6a44e3de7e1d0d444547e52c9c24d3970034fdeeb210ed

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 9a57af1853a25c25f15817875abc6e6842365a16ec67c0326dd090086c3822e8
MD5 8a758933904de7e25f825fabc51c5531
BLAKE2b-256 8c8b393e66c6887c7da35693d52251460f76b216f6f6913c14286e18caef6677

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 4bb2087342f8ef6111e1fc928c8438dfb5b47f7f4170d91c80ed76f2208c1e92
MD5 48c5ab90c04bae1eb841a21933f42e13
BLAKE2b-256 adf502457ae1139876c4dfa1a48c69bcb8e074fea52da86797e57843ca60713e

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp310-cp310-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 28be815ca8c75091abbafd293f58682f143165f72135299f2a81a065ee600e3d
MD5 12dd6301578e1d989eb00ec317ef7fec
BLAKE2b-256 b8153d2772b6cffad264f2cc78b20dc50b672d8a42a6326a5d451141e052165e

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f0e24bb13228cc891a9222bf1d3de46aa204e74f6b8e5c3785a2fe513ef88424
MD5 52f67890701f2b2531e1fca5091d93b5
BLAKE2b-256 1719fc3e150a6452a1558a7f221587239b0d535e950b5444dde91f315582b8cc

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: lupapy-2.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 22fff31ba0b3dfbed1dcf346b7ac86b39a8c69283d5010ce179dd0e600cc81ce
MD5 3f14cffb103b5839c864083e0b343aee
BLAKE2b-256 f1e64a7780070ea18508b0a0a00fa541e08b64e08e274cae710fdd7330d1240a

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp39-cp39-win32.whl.

File metadata

  • Download URL: lupapy-2.2-cp39-cp39-win32.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 4d298188b68944406507778990cc24aae21e285b06401efed6af33c463f18800
MD5 1359b02139fb3d1375a444675884edaf
BLAKE2b-256 169a88af20f600b4bff54002d313d3915fab2678b4cf85851d05fa4c96d96dd7

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e4ea626bb0eae74ccec8aa88a09500e08a8ed0581ac241fd58d1223f0a8f8768
MD5 22f4d7eec4129b9916c1be8269a68c1c
BLAKE2b-256 d1479bc39ab3128be007686b9c0d83dbf9d087949c7c996d05ab930b80a01d8c

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp39-cp39-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp39-cp39-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 d045f33b7e89bdeec7e5da154848db470c2ee99979e50132f9e0ff8d20077810
MD5 24672c73dd8962f51c935f3104c83c03
BLAKE2b-256 5cd768d1f497ef4f052679e4341a102e0b15c18920f07eaf4c07b368b1bc0eee

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp39-cp39-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp39-cp39-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3f14d262cf5b87c2aa8f1c305b6330056bce5afbe1c688dc2cb7e9750d158c8b
MD5 fd1f38b370baf06e476531d4cdb3bb2f
BLAKE2b-256 3197277bf2576b4fe8baa4b9efd46ae16f26318965cab8e84ecc926dcdc7f7e7

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d809f555d3d06e9cc69186586cf529118b596c9ba72eb893b396a7582bcd3fa8
MD5 b4b8492bbee6402ec86f5f75bb2ab1c2
BLAKE2b-256 586d84df26061c09e9cfdcad20680ce34d0469a97e21bae32be991d646a1e889

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 297a02c2e9224b765b66ba4e30bd08a246f959e1bb1c29664496436909676351
MD5 76befcecf6ed0de52dd31c1e31d4e7cb
BLAKE2b-256 cd3675e510c2e64ba46301c08cf3cbeeb82cbca3414522fbe1d1e886ef2bd3f0

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 ec28f8da0b9773b9e3023839fb4c2a98de475033c3eb2203170d3e94130cc107
MD5 389e5cf86825b1f371b82b61d8c45d51
BLAKE2b-256 b35b4328b470bb6b2b083295d2f25646d170fa1c24873d8273db62a62615fb71

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp39-cp39-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 b8aef07d47a6ed73725b9ca01d42176877001e25511ef2439816d02e60485c4c
MD5 ab32537a8e49b4c40aa1d17fd1cf3e00
BLAKE2b-256 bce5418c32c4f4dbf44e8290b9ccac1838a3e5e5838137dd61d9d6e945061715

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp39-cp39-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp39-cp39-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 0fbc6c42404d2879c7cfb46ac613eb2ffb2afe6b8831aab4f8602937228c6a4d
MD5 94484ec00bdfb8b3d84f353aee689286
BLAKE2b-256 25186a5e0db83736ecbfdd54c1b10a2994253e9cc12b37c320a76ebc6a24b9c6

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 848d05ab14455cbd12681a160677b805f5f5c543dfe67ff27d4ce8e4dbb1e94e
MD5 ff8b66e6cbb07ee51791bd8626e9eb8d
BLAKE2b-256 1f6425babb8fe96528f5f675c1b79f7a2202b3cd42438d749e6f46857fc7fa68

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: lupapy-2.2-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 79c3dcbeada60a25da8a536b3dc1b45b7cace2b0cf8043f08cd80a159f049e46
MD5 bbd1a401af50a27a46f80aae928af055
BLAKE2b-256 f41e24d0d320b99ccd95422b6814878e3424ccdf9149bfede1ce9eafd61215b3

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp38-cp38-win32.whl.

File metadata

  • Download URL: lupapy-2.2-cp38-cp38-win32.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 dd36338abe1c67c313f627f9bf670d45ff0153a6ed11be1e0d215be13383f38c
MD5 74f3c1ec276db6f2ce44ce3832b01468
BLAKE2b-256 2e14c8aa9dccd60390b6c11fcd656d0fcc9bd829532ea9674e1bf0475ab7a894

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp38-cp38-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 47e56eefe987c97b135d5552f0d767bd261b63ba1c44b4b3fe4412ddc7a6270f
MD5 538574459d25be1603c78eb42c3d3f80
BLAKE2b-256 46d8917d2bdd18e790dc5da250073c4b0b85c4bff9e527001e3d33fbde846aae

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp38-cp38-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp38-cp38-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 724ee00cf0406baf352ea7f9f039fafb2cdc4631059cd6c6eb85b8a93e0ef4ef
MD5 6baea36405cdcbf8ccd415739e24a2ac
BLAKE2b-256 0452a1d364129221bf2bacc4984c8d9210e80b0da6aa9e223d9f1030ed5c0b72

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp38-cp38-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp38-cp38-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e215177cd983ecb0495c24998f0c6b9310835a9c9f340af5e3fce0b2eab7fd92
MD5 c7b3cc5411184e8aff0ed8aa96f492ee
BLAKE2b-256 101a31141a205db5b50cd9cd7bb2a71b310f72395ea4960f640dc7b20ad0e591

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0890b5280df340f3e4e882589f24d4cff424eaaf4034b44afc41ac574a230a5d
MD5 9692ded1fe40227bbd7fa70bcea74073
BLAKE2b-256 57d35e5499b4052e937247e30c595fdee3f858ec71a19a80a6bb970d349a57c9

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bfefc28d7eea1f5b3d88b408e69a9bdb334928e928fb18216e36ab148ea9b74b
MD5 a6dd169c0f2acaf70a8e038c5ceab021
BLAKE2b-256 bb91ec221b5eb942d7e249401fb29648f7e20d6cea7208f89b8d1a0e2e8290b2

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 2166be815b0cbed1cf22866597437850b71fc847b6455c680629bfafa9558215
MD5 35b9ee669ffe508d9144e1b0e1d32e45
BLAKE2b-256 b0d591ea866dbe9fdfdf05a0844c63404bd2c75562427abe9b8aa7d7baa2d104

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp38-cp38-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp38-cp38-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 6dd397ec82787612a17b55ae3c6189dfaf54cda0f96610921659fd980aaea306
MD5 cdd55c416b715acff24f64aeeb20ec33
BLAKE2b-256 adda2a5813a5be3ec7f3c43fb2d0bbd724432d4aa6645b02e6086e18d70b2ac2

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 94cea51126ee6cbbe1f0ba9beab6ffb2d8362966c5cf1305fa2779143b9c1c5b
MD5 87e375cddaf02c50102a9f69c0c6b3b4
BLAKE2b-256 d971a457b0045ec8185ae45938ffb03797ccd32cf5f922b39d65f1d9a78a5411

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: lupapy-2.2-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 e015cfa30933de9271506fdcee51b300ff8b82e0c8c9d819ea60562d8277249d
MD5 fc4603253e1f78ed40fa9ebce9b5e9c2
BLAKE2b-256 497c96280ffc95e5e10401c7a3e1a13d748b847ef35bd6cec6b4107989722a1e

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp37-cp37m-win32.whl.

File metadata

  • Download URL: lupapy-2.2-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.7m, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 1cdecb040628cc138756f40edc02ac53fd35cdc55c19c8e7074f63f141ded496
MD5 0160e6584dc728949b4a77748bda563f
BLAKE2b-256 21cfde7d149d78df088289c5dde7addde058e61d75e4761d024aa9e3224229c4

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp37-cp37m-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp37-cp37m-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6e5daf5c0e5e3f2ecb29a939836853af7fd0a69e688ff4a51dd50cecc853ac6c
MD5 963705aea8ce23fe31df9c2b398d61c7
BLAKE2b-256 83b648de90373270217e7dc5e896aefa105a96c058f1ab46789db6af473dadc2

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp37-cp37m-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp37-cp37m-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 926161fb9410224048c3abe5f4590d90d0f7b215e0af8bb63381e68fd0c0e7ed
MD5 42b502275dc1da452d7b561b87c6e3a3
BLAKE2b-256 07fd7890df2003e73e702478d31ffa387bc933b5fa439cc222dfc55d6cb9c183

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp37-cp37m-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp37-cp37m-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 52bacecb392c7c07cd23b4670e33d6f67471495ee4186369ebd9cf6fe9e7e072
MD5 5dbc449435fabc55c64e1bb677aac99e
BLAKE2b-256 fda8a1eebee540da7cc0f6ee18e2fa402c7e0878eba10a9f3b92f23bf22d0a35

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5f2a8fecd3be4255e79fe94e37c58db957be36064d2bee34b45a59eb633d37a3
MD5 75a384884e672bb4ac59914c0a16acd9
BLAKE2b-256 17cb92edfee7899bafd972c56ed2b188ef011786fcfbedd2c5389b89d50273a0

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 70d2ff52baed8e31ff4f6ec55e15daa30e8066aa50e50198817e125213cc3c91
MD5 80a7b7e241f0d38f4cc24a9f5a4bc3e4
BLAKE2b-256 d41a08e41133d35d97401f260bf5021680240c3d009b95c5ae56b1bbd51edb0c

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 b97d4915498703a4bd03070624ad5cd6d42418fbcafb3e6cfef82b11cf5943e7
MD5 3790523a4f4f76dc350708ef8bd8118f
BLAKE2b-256 2e4f2f7626f20b49cb53531a80a3ce00b15e8cbf199738a44c8cfc07b205f00a

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp37-cp37m-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp37-cp37m-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 78eb4c5b5310ab6bd711472823894f1f5ca544510bde7794c6d5b47d75f913a6
MD5 21a1fab3d05dd070782afed8e2bddde7
BLAKE2b-256 901635e16713212604f95774b92bf8bc697b656987b339ebbbfc14aee0071d27

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: lupapy-2.2-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 5423c83ecf9eb3cf9b79e574408841e2566fc8d34a8c143fe5bea7fdd2e82de5
MD5 1b48684ca4730d1503edc3220f37a4ec
BLAKE2b-256 6d4b4163b4f971601ba382e142f2676c0deb7b689f5ad8c38b5df03a9d60431b

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp36-cp36m-win32.whl.

File metadata

  • Download URL: lupapy-2.2-cp36-cp36m-win32.whl
  • Upload date:
  • Size: 1.5 MB
  • Tags: CPython 3.6m, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for lupapy-2.2-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 ec9ae66402241507adb3878913cb467d948bec24a0ceb7661fc690fde8a42eab
MD5 ecaa7c5b50dca3f3bb892f44c68898af
BLAKE2b-256 902500b3487070a61bad6b877cdf9a8c05ba8f98ae84053d86b6f1470f946813

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp36-cp36m-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp36-cp36m-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7535ecf59feb383594a89dddd2e0c3ab00c327a5387195c858fb7c2c3f550054
MD5 7bd5c4bc29381405edc0ab7eb4cb0518
BLAKE2b-256 88ff6d1ba1ef8d51e89961876deacf078aaf6341a8d9184e8d783a95ff8af2d5

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp36-cp36m-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp36-cp36m-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 76b3c750d83113bea49ba22503793fd32c06f4c517aa3be120ec1bd859ec3d86
MD5 0d44f3048e96521fb9c86aa4e3757187
BLAKE2b-256 a94381f7821d1930abb95eeae3548e30b505777f87c579c19340d5132beafdb4

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp36-cp36m-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp36-cp36m-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 53382a5a95c3ea9bd97a5ae91e6a56859cebfa2994e8f534ba1a9038723847f9
MD5 0beb2df2e0fbc65778e35dd6765987ea
BLAKE2b-256 e7a49d4638b0f0bea8b945598869feca5775a588e991b97da3cc518bcceed4d9

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f68e82d8072356f76c34460590089ee68f513c74b61bc28ce491bb3d1cd23ae0
MD5 b9981f7ee90d097ee1d44726a05b7dd4
BLAKE2b-256 ae32cc5f2a0f7ec68cff87fdac58a7e8e20d228cccce768e2c52ac0b8ac1b469

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 dfbd4c5711d539e4a70f2f5a763132d921b58ee057b71ca89dd634af444f38df
MD5 83cd651740b3048acb1efe12cdc5aad5
BLAKE2b-256 6bb2d10854a2fc1074dc80d89567dd00512b9b962ce8b987b626d6ad12994bd4

See more details on using hashes here.

File details

Details for the file lupapy-2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for lupapy-2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 d5e2c4d3d8cd43bc93c26e77dae4d302daa1fc8133af2a031053678c53927e11
MD5 e1a9256eea0f538dddb903e1bfb95212
BLAKE2b-256 8bd6d671f47e7b4fdb4b2a62511c8c37567fceb019acbfa95a886ad51bce1728

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page