Skip to main content

Get control over your imports -- no matter how you run your code.

Project description

ultraimport

Get control over your imports -- no matter how you run your code.

Overview | Installation | Quickstart | Examples | Documentation

PyPI Package Run Tests Python >=3.9 License

Overview

Features

  • Import any file from the file system as Python code:
    • Works independent of your sys.path
    • Works independent of your current working directory
    • Works independent of your top-level package
    • Works no matter if you run your code as a module or as a script
    • Does not care about __init__.py files
    • Use relative or absolute pathes
    • Use relative imports in scripts
  • Dynamically wrap your code in a virtual namespace package
  • Preprocess code for optimizations (see example)
  • Recursively rewrite subsequent relative import statements (see example)
  • Dependency injection (see example)
  • Lazy loading (lazy imports for modules and callables)
  • Make imports work in code you cannot modify (e.g., auto-generated files, legacy code)
  • Fix circular imports through lazy imports or dependency injection
  • Fix the error: ImportError: attempted relative import with no known parent package
  • Fix the error: ValueError: attempted relative import beyond top-level package
  • Better error messages

General Approach

ultraimport is built around an own implementation of the importlib.machinery.SourceFileLoader. This allows to take a different approach on finding code while still being compatible and integrate nicely with the normal Python import machinery. It also allows for some advanced use cases like virtual namespaces, pre-processing, lazy loading, dependency injection and last but not least much better error messages.

Is ultraimport supposed to replace the normal import statement?

No! You will continue to use the builtin import statements to import 3rd party libraries which have been installed system wide. ultraimport is meant to import local files whose locations you control because they are located relatively to some other files.

Issues

Currently, there is no integration with any Python language server for code completion in your IDE. Code completion in the Python REPL works as expected.

Installation

Install system wide:

pip install ultraimport

Install a local development version:

git clone https://github.com/ronny-rentner/ultraimport.git
pip install -e ./ultraimport

Quickstart

Note: You can find this quickstart example and others in the examples/ folder.

The quickstart folder looks like this:

quickstart
├── cherry.py
├── readme.md
├── red
│   ├── cherry.py
│   └── strawberry.py
├── run
│   └── run.py
└── yellow
    ├── banana.py
    └── lemon.py

The entry point is the script run.py located in the quickstart/run folder. If you want, you can directly execute the example script by running:

python /path/to/quickstart/run/run.py

Inside the run.py script, first we import ultraimport:

import ultraimport

1) Import from parent folder

This example shows how to import the Python module cherry.py from the parent folder. Note that __dir__ in the file path refers to the parent folder of the file that is executing the import. In this case, run.py is executing the import and it is located in a folder run and thus __dir__ refers to the run folder.

cherry = ultraimport('__dir__/../cherry.py')
# <module 'cherry' from '/home/ronny/Projects/py/ultraimport/examples/quickstart/cherry.py'>

2) Import from sibling folder

This example shows how to import another Python module from a sibling folder.

other_cherry = ultraimport('__dir__/../red/cherry.py')
# <module 'cherry' from '/home/ronny/Projects/py/ultraimport/examples/quickstart/red/cherry.py'>

3) Import single object

Import the Cherry object from cherry.py and alias it to the name my_class. You could also provide a list of strings instead of a single string if you want to import multiple objects.

my_class = ultraimport('__dir__/../red/cherry.py', 'Cherry')
# <class 'cherry.Cherry'>

4) Ensure type of imported object

You can make sure my_class is actually the type you expect, a class, and my_string is a string, otherwise a TypeError is thrown.

my_class, my_string = ultraimport('__dir__/../cherry.py', { 'MyClass': type, 'some_string': str })
# <class 'cherry.MyClass'>, "I am a string"

5) Import all objects

Using the known special string '*' allows to import all objects.

objs = ultraimport('__dir__/../cherry.py', '*')
# <class 'cherry.MyClass'>

6) Add imported objects to a namespace

You can also provide any dict as a namespace. A common value to use is globals(). If you set add_to_ns=True, the imported objects are added to the local scope of the caller.

ultraimport('__dir__/../cherry.py', '*', add_to_ns=globals())
# <class 'cherry.MyClass'>

7) Give imported module a known parent package

The next import would fail because the imported banana.py contains another relative import in line 1: from .. import cherry as relatively_imported_cherry.

try:
    banana = ultraimport('__dir__/../yellow/banana.py')
except Exception as e:
    # <class 'ultraimport.ultraimport.ExecuteImportError'>
    pass

If you would try to excute banana.py directly, you'd get the famous ImportError: attempted relative import with no known parent package error. To solve this error, just give the banana.py module a known parent package by using the package parameter. The relative import from above has two dots, so it means go two levels up. Thus we need to give our banana.py module at least two levels of parent packages by using package=2.

banana = ultraimport('__dir__/../yellow/banana.py', package=2)
# <module 'quickstart.yellow.banana' from '/home/ronny/Projects/py/ultraimport/examples/quickstart/yellow/banana.py'>

As you can see above, the package was derived from the path automatically according to the package parameter value.

8) Embed module in a virtual namespace package

You can also provide a string for the package parameter to define the name of the package. In this case we create a package called fruit pointing at the parent directory of cherry.py, the file that is being imported.

cherry = ultraimport('__dir__/../red/cherry.py', package='some.fruit')
# <module 'some.fruit.cherry' from '/home/ronny/Projects/py/ultraimport/examples/quickstart/red/cherry.py'>

9) Integrate with normal imports

After creating the fruit namespace package as a side effect of the import, you can use it to do classical imports. Remember that the fruit package points to the directory red.

from some.fruit.strawberry import Strawberry
# <class 'some.fruit.strawberry.Strawberry'>

10) Create virtual namespace package

You could also explicitly create a virtual namespace pointing to the directory 'yellow'. Note that __dir__ in the path below refers to the parent folder of the file that is executing the import.

yellow_ns = ultraimport.create_ns_package('yellow', '__dir__/../yellow')
# <module 'yellow' (<_frozen_importlib_external._NamespaceLoader object at 0x7fba8de36920>)>

For further imports, the package_name yellow must be used as provided as the first argument.

from yellow import lemon
# <module 'yellow.lemon' from '/home/ronny/Projects/py/ultraimport/examples/quickstart/yellow/lemon.py'>

Let's add some other module cherry.py from a different directory to our virtual package. After you have added the module to the package, you can again use normal Python imports to access it.

ultraimport('__dir__/../red/cherry.py', package='yellow')
from yellow.cherry import Cherry
# <class 'yellow.cherry.Cherry'>

Documentation

The full interface documentation can be find in the docs/ folder. This is just an excerpt of the main function.

ultraimport function :link: source

ultraimport(
    file_path,
    objects_to_import=None,
    add_to_ns=None,
    preprocessor=None,
    package=None,
    caller=None,
    use_cache=True,
    lazy=False,
    recurse=False,
    inject=None,
    use_preprocessor_cache=True,
    cache_path_prefix=None
)

Import Python code files from the file system. This is the central main function of ultraimport.

Parameters:

  • file_path (str): Path to the module file that should be imported. It can have any file extension. Please be aware that you must provide the file extension. The path can be relative or absolute. You can use the special string __dir__ to refer to the directory of the caller. If run from a Python REPL, the current working directory will be used for __dir__. If you use advanced debugging tools (or want to save some CPU cycles) you might want to set caller=__file__.

  • objects_to_import (str | (Iterable[str] | Dict[str, object]): Can have several modes depending on the type of the parameter.

    • (str): Name of a single object to import from the module in file_path. The special value '*' selects all objects from that module.
    • (Iterable[str]): A list of names of objects to import.
    • (Dict[str, object]): The keys represent the names of the objects to import. The values define the expected types of those objects. A TypeError is thrown if the types don't match the expectation. If you set lazy=True, you must use a dict for objects_to_import and define the types.
  • add_to_ns (Dict[str, object]): add the objects_to_import to the dict provided. A common value to use is globals(). If you set add_to_ns=True, the imported objects are added to the local scope of the caller.

  • preprocessor (callable): Takes the source code as an argument and can return a modified version of the source code. Check out the debug-transform example on how to use the preprocessor.

  • package (str | int): Can have several modes depending on if you provide a string or an integer.

    • (str) Generate one or more namespace packages and use them as parent package the imported module.
    • (int) Number of path parts (directories) to extract from the file_path to calculate the namespace package. This can help with subsequent relative imports in your imported files. If package is set to the default None, the module will be imported without setting it parent __package__.
  • use_cache (bool): If set to False, allows re-importing of the same source file even if it was imported before. Otherwise a cached version of the imported module is returned.

  • lazy (bool): Experimental wip If set to True and if objects_to_import is set to None, it will lazy import the module. If set to True and objects_to_import is a dict, the values of the dict must be the type of the object to lazy import from the module. Currently only the type callable is supported.

  • recurse (bool): If set to True, a built-in preprocessor is activated to transparently rewrite all relative import statements (those with a dot like from . import something) to ultraimport() calls. Use this mode if you have no control over the source code of the impored modules.

  • cache_path_prefix (str): Directory for storing preprocessed files. If you use the preprocessor feature or if you use the option recurse=True (which in turn uses the preprocessor feature) you will have the option to store the resulting code after preprocessing. By default, they are stored in parallel to the original source code files, but this option allows to override to location. One common setting is cache_path_prefix='__pycache__' to store the processed files along with the bytecode files. _Note_: Even when you change this directory, this will be hidden from Python. Towards Python, the preprocessed files will always look like they are in the same directory as the original source code files, even if they are not.

Returns: Depending on the parameters returns one of the following:

  • object: If objects_to_import is None, returns a single module object.

  • object: If objects_to_import is a str, returns the single object with the specified name from the imported module.

  • dict: If objects_to_import has the value '*', returns a dict of all items from the imported module.

  • list: If objects_to_import is a List[str], return a list of imported objects from the imported module.

Advanced Usage

See docs/advanced-usage.md

Better Error Messages

See docs/better-error-messages.md

Contributing

We love contributions!

ultraimport is open source, built on open source, and we'd love to have you hang out in our community.

The Issue: Relative Imports in Python

Classically, to do a relative import, a Python script run.py would look like this if you wanted to import the logger object from a logging.py module in the same directory:

from .logging import logger

def main():
    # do something

    logger('I did something')

if __name__ == 'main':
    main()

If you try to run the program in usual way, you'll get an error message:

$ python ./run.py
Traceback (most recent call last):
  File "/home/user/myprogram/./run.py", line 1, in <module>
    from .logging import logger
ImportError: attempted relative import with no known parent package

Python programs or scripts can be executed in a number of different ways and surprisingly, with some of the ways, it even works:

# Broken
python ~/myprogram/run.py

# Works
cd ~
python -c 'import myprogram.run'

# Works
python -m myprogram.run

# Broken
cd ~/myprogram
python -c 'import run'

# Broken
python -m run

# Broken
python ./run.py

# Broken
~/myprogram/run.py

You wonder: Why does Python come to a different conclusion depending on the way how I run the program?

The error ImportError: attempted relative import with no known parent package is rather erratic because the code has never changed. Sometimes you would also get ValueError: attempted relative import beyond top-level package.

There actually is a known parent package. It's the directory where the code lives in. Sometimes Python can see it, sometimes not.

Even if there was no parent package, what's the issue with importing a module that I only know from its relative position to my current module?

With ultraimport your program run.py will always find logging.py in the same directory, no matter how you run it. You could change it to look like this:

#!/usr/bin/env python3

# ultraimport needs to be installed and imported in the classical way
import ultraimport

# Import the 'logger' object from 'logging.py' that is located in the same
# directory as this file.
# Note: `__dir__` refers to the directory where this file is in.
logger = ultraimport('__dir__/logging.py', 'logger')

def main():
    # do something
    logger('I did something')

if __name__ == '__main__':
    main()
else:
    logger('I was imported')

As you can see, you'll have to import ultraimport in the classical way. It's intended to be installed as a system-wide library. Afterwards, you can import your own code based on relative or absolute file system paths so it can always be found.

With ultraimport, Python code can be executed in an way and the imports keep working:

# Works
python ~/myprogram/run.py

# Works
cd ~
python -c 'import myprogram.run'

# Works
python -m myprogram.run

# Works
cd ~/myprogram
python -c 'import run'

# Works
python -m run

# Works
python ./run.py

# Works
~/myprogram/run.py

Python Relative Import Limitations

https://peps.python.org/pep-0328/#relative-imports-and-name

Relative imports use a module's name attribute to determine that module's position in the package hierarchy. If the module's name does not contain any package information (e.g. it is set to 'main') then relative imports are resolved as if the module were a top level module, regardless of where the module is actually located on the file system.

Project details


Download files

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

Source Distribution

ultraimport-0.1.0.tar.gz (263.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

ultraimport-0.1.0-pp311-pypy311_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (178.0 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

ultraimport-0.1.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (180.8 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

ultraimport-0.1.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (173.1 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

ultraimport-0.1.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (176.6 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

ultraimport-0.1.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (172.9 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

ultraimport-0.1.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (176.3 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

ultraimport-0.1.0-cp313-cp313-musllinux_1_2_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

ultraimport-0.1.0-cp313-cp313-musllinux_1_2_i686.whl (1.2 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ i686

ultraimport-0.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

ultraimport-0.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

ultraimport-0.1.0-cp312-cp312-musllinux_1_2_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

ultraimport-0.1.0-cp312-cp312-musllinux_1_2_i686.whl (1.2 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ i686

ultraimport-0.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

ultraimport-0.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

ultraimport-0.1.0-cp311-cp311-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

ultraimport-0.1.0-cp311-cp311-musllinux_1_2_i686.whl (1.2 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ i686

ultraimport-0.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

ultraimport-0.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

ultraimport-0.1.0-cp310-cp310-musllinux_1_2_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

ultraimport-0.1.0-cp310-cp310-musllinux_1_2_i686.whl (1.2 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ i686

ultraimport-0.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

ultraimport-0.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

ultraimport-0.1.0-cp39-cp39-musllinux_1_2_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

ultraimport-0.1.0-cp39-cp39-musllinux_1_2_i686.whl (1.2 MB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ i686

ultraimport-0.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

ultraimport-0.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (1.1 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

File details

Details for the file ultraimport-0.1.0.tar.gz.

File metadata

  • Download URL: ultraimport-0.1.0.tar.gz
  • Upload date:
  • Size: 263.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for ultraimport-0.1.0.tar.gz
Algorithm Hash digest
SHA256 bb1568a175e50655c5060b4e2e69ea84e70880fe3b745bdb50a181a1378e8dcd
MD5 ff605416d4a902720b81e579637c5f32
BLAKE2b-256 8a71db0c419d266e1bd52982fd55e487054ef53dffbc37139706bb20c6a6e067

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-pp311-pypy311_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-pp311-pypy311_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 13fa464bbfb1eff5055a2c7ebe9df2b3d1f904a6ef4a72e5dc34116e971d0dfa
MD5 8fc9be1de7d80a33c26b0625a5e72cee
BLAKE2b-256 86966e5ebe97aec54aede6086aceefe3839695509114d4d11d9a7fbf66f59fef

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c3a234f223398ead1a10e966fa6f10b411768bf1ccce3024a49204a3e6f622bd
MD5 35f750ebacc6b7494ff66c5a9ef119f9
BLAKE2b-256 825829c54a3d479fb74eea3cd02a56435f954808854e3b45a7bc254a5e3b7cbc

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 81bc648331358134cc6c9b2e3de42995c922c60d2cc48f3ae3005fd05675e1bb
MD5 ceb3b0aee08f25006db2753f53bea0a4
BLAKE2b-256 ac7a615d99d83bfb845758ac67441b10efd5beeb6e05a0ef95ea0b5efdb9522f

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 4c444ea1e2c98e204a52fddec87335e89b435ac25a53a7f6fac82f7643531b81
MD5 ff6065b02a16bc8e9509ea879b671af2
BLAKE2b-256 1361493f9c9250f4b378ec3413a3886852949bda3a07de0847b077e310f98806

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 67199aefbf255231cf0c5ae8220fdf4ca8eb542fbbbe1e21cf2e440e761b319f
MD5 0a93bf7e090eaec640adc91ee0b3a592
BLAKE2b-256 cc3dd4113d8c59d172bbce6673ec333c75f5423946ffbf2cc9f19963bffeeb5c

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 a58e5c34b59201eb32c907d16e6e125da209fb96f5890b9621e24a2828df7ce1
MD5 38f3a3d79dd181b3a9df7185a1b2f892
BLAKE2b-256 07c0028ac10b97c663eb90bacaa2d7202a482d88eb71d3fa83ede9ac536b214e

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7d1dfe329d93345ec5a6b79f8caf6d5921233dfbdcfac54fefa6062671d3d719
MD5 fc78b66c751d8272e773d1369b6aed7d
BLAKE2b-256 3e979ad6c72499f72e739d279b2fbe9f924c6b33140a3b4ef1b028942e2e3784

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp313-cp313-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 be31098a216e76a7bde6a0916467b124bf330dbdf116fc9cc5440e163fdc0de1
MD5 141c5bab06f8fd8d6e359179d65926b9
BLAKE2b-256 224bbab9d7f9e38abea3d9894e3bcc2c0da0241c59b44411da62fdac53188516

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 64f80af9201017b02d1992015a3f21f3b6e409a2590cf20772da1dda9fd12309
MD5 b4de5082b647b515a7d73ea78fd24642
BLAKE2b-256 69259f2c718594609d6d4b93c1273d2513edcf4e158da9715ed4813152bcf6a9

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 d6f367dd29debdba7695a4cdb169d777fc66689fb78ae68e02877862c555d270
MD5 4de518893b7bfb9b02a7ce8e65769ab2
BLAKE2b-256 92c07e4175b7ae3f75e226f39cb6b952864a5050e3454810f1227a8728f25262

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a4b9b089551b3268df487fc005c31910b7e8d379b0919dbac7c25259c5ccf743
MD5 42c3f68e2e47072a8dd20aa20159cb32
BLAKE2b-256 41094581ea5726072c9dd5c9fb712f13f32987aab23c9528b34d0461b0b8a6a9

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 816d343d008fb2596b9e5615bd41ed10e9645beb8e9a61c107aa93e087495cf5
MD5 a6a661cee58c265389d65c3a9e8b2987
BLAKE2b-256 aea7b964a621beea9f03897b4b4ae0f240fdde8e5c6b924f00399ee63d199961

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fbf80a9682155cf5052d15cc49d6dd9c50b16eb78df32a5eb486d253eec835de
MD5 beb88748f22e8a23e5202f20e7ad8278
BLAKE2b-256 a141eb9ad1de4422a8b4953703c518e1739e21e497dbdc23d6ae2eec35a44073

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 19b4457c9257e6cca1833f65aa0974ebda9ae6d1071dd7c0b99c06abc5c64c7a
MD5 69f3c8216ad5a7705b767a065c66ea8d
BLAKE2b-256 b9b4ed24d5a946db57ad9ba428a36903c6c1bc6e68d36b77f830cca8143ea314

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5c6dc2f9cc63e7fbcafd728cb8cfcaed471b68b154de099011dd66def025233d
MD5 31de5af17b6d912726785420a6578203
BLAKE2b-256 44be939c18a23e93e694fab98ae06ebee228336db61e9ffe57dda7bb7c8d9561

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp311-cp311-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 23dc0ac2897252cc74a84dc3b15d755b52a5b8275ea35d5110d2505f864ea016
MD5 e94217dd17315368c7d489e323f38a80
BLAKE2b-256 ba36f0cbb3c1545953a898f6327019e1da2ac3bada2de79d29b537857b9e7512

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 62e0b7458e16cf3feaad07b7a17c4a6362b5679e7c1efec5036d444d13c81bb2
MD5 ee2b99ada4d2156fbcb0ff9a5caae43d
BLAKE2b-256 1ec5620f633cb7529cacf41297d81d4053a63dbe22b93c1d918e59ea97dd8efc

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 e4961d8e317db2f7bfb237f8f5db5cb727459ee5b2773b6ee0da46b712637f7c
MD5 5ca3edff1fff46d0501c1d532d4dcc3e
BLAKE2b-256 9177b1b22127558408116cd3e53f786262d3190d8dcaa12f9864fdbe92d2c4a8

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0d0fa9a7839f6745d242f45125c3b1abba1289c84c8b45b4d98a33d8eea6275f
MD5 97f74d158e014ba49c1cfe1fd20b982b
BLAKE2b-256 1446cc8f636642d1a0c181662e7cac56a48a90d89a5a4a2be69b5994f90121a1

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp310-cp310-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 78dd9b8b7773da8773d0894a4ff4c41fcc4ee76b151ad2a498080bedad615910
MD5 a67b56130a950b5507e75f01f90e02fc
BLAKE2b-256 41020a3bba1f467a4f5c2858185b217dd20ce86e088d287a53608ca20b2bd572

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 18113de7f3d22d787a7661e45fb7d39ab9483ad518330e3c7390b72e76b9e8ab
MD5 ee0e3ccf1d002f96b114d8f3645161b3
BLAKE2b-256 1c8aa890605130c2ea712fd724985dd69a149531184b0be25a76d85f35c6111a

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 1afad06527e17a5eaf5de9aa649a7d189a3f497fe33556f0ec44637cdd45ae1d
MD5 babb576a23f9d136d1fe7bb0b21ae909
BLAKE2b-256 129a59d94387f4623aaa8cc0a23cc6d7c3fcf717aef79b50840298b0b67e595f

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e8d8a953b1f252bfdbeb832f29071b2e2d15ca73ea87f241776d65d8d814f88d
MD5 3f3c42f5127cb63743eed1a05c8e131a
BLAKE2b-256 60a6e625f1b9b465236211b83e06414029b19f1a5a21d1b786ef8524d56079e7

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp39-cp39-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp39-cp39-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 a90f5136483921ddf90ef18ecd22d05ca21a0c15ade6c87165365b482a4ece27
MD5 511e4b82f217ef76add23745d6a62669
BLAKE2b-256 f4b848b191057aa77b3710d417d17baa89d1cdd2935b43e74a66e501640e953e

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8ec0b90f4e4d8e8a2ebc62ef7f31620943074e9d928feaddccc99c5fbae9b675
MD5 6b23060072aeea573bed873498ddd72d
BLAKE2b-256 e107e1620de8e8bdde2563afd369787d93d6749746c1f4915e8002f97be743c9

See more details on using hashes here.

File details

Details for the file ultraimport-0.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ultraimport-0.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c983ac418715110841b03cd52da8b8d1b4c9a24787d910504e8b0033515aeb41
MD5 dd27e157a79cc3a9debdef96234bf2db
BLAKE2b-256 b58cd512bb5fb86e2f1ea1a64d6bd52b983eae56fbb3483b51e8b1f8d3454539

See more details on using hashes here.

Supported by

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