unbox
Finding imports in code
To install: pip install unbox
What's here
Lots of little goodies to help you analyze the imports of your, or others' code.
Getting a list of missing dependencies
>>> from unbox import print_missing_names
>>> import some_module # doctest: +SKIP
>>> print_missing_names(some_module) # doctest: +SKIP
SoundFile
i2
librosa
pyttsx3
slink
These are the names a package imports but doesn't declare. The declared names are
read from the package's pyproject.toml (PEP 621 [project] dependencies), falling
back to setup.cfg ([options] install_requires) for legacy projects:
>>> import unbox
>>> unbox.find_install_names(unbox) # doctest: +SKIP
['findimports', 'dol>=0.3.49', 'importlib_resources', 'config2py', 'py2store', 'xdol']
Use unbox.module_requirements_according_to_pyproject(pkg, extras=True) if you also
want the [project.optional-dependencies] groups.
Seeing what the dependencies of a package are, before installing it
Simply get a list of dependencies for a package from PyPI.
>>> import unbox
>>> unbox.dependencies_from_pypi('pandas')
['numpy', 'numpy', 'python-dateutil', 'pytz', 'tzdata']
But you have control over the requirements that are returned, and how they are returned:
>>> it = unbox.dependencies_from_pypi(
... 'pandas',
... requirement_filter=lambda x: True, # don't filter any requirements
... requirement_trans=lambda x: x, # as is
... egress = lambda x: x # just get the iterator as is
... )
>>> next(it)
'numpy>=1.22.4; python_version < "3.11"'
>>> list(it)[-1]
'zstandard>=0.17.0; extra == "all"'
A dict-like interface
The base of unbox is just the dol interface to findimports, which then allows us to offer a bunch of functionalities easily.
Say you wanted to know what dol was made of.
The dol way of doing this is to make a Mapping (i.e. a key-value dict-like interface),
and then do what you do with dicts...
>>> import dol
>>> import unbox
>>> s = unbox.ModuleNamesImportedByModule(dol) # make a store containing the modules of the `dol` package
>>> # Now wee how you can do things you do with dicts
>>> len(s)
15
>>> list(s)
['dol.__init__',
'dol.appendable',
'dol.base',
'dol.caching',
'dol.core',
'dol.dig',
'dol.errors',
'dol.filesys',
'dol.mixins',
'dol.naming',
'dol.paths',
'dol.signatures',
'dol.sources',
'dol.trans',
'dol.util']
>>> 'dol.appendable' in s
>>> # The values of `s` are sets of modules imported by a module.
>>> s['dol.appendable'] # what does dol.appendable import?
{'collections.abc', 'dol.trans', 'time', 'types', 'typing'}
Check out ModulesImportedByModule also, which gives you a Mapping with module objects
as keys, and findimports.ImportInfo instances as values.
imports_for
As an example of what you can do with this set up, have a look at imports_for.
Or don't have a look; just use it, since it's quite useful.
from unbox import imports_for
import wave
assert {"collections", "struct", "sys"}.issubset(imports_for(wave))
Note that we only check a subset here: what a stdlib module imports changes
between python versions (py3.10's wave imports audioop and chunk, both
removed in 3.13, while py3.12's imports uuid).
At it's base, imports_for gives you a generator of import names.
With the post argument (defaulted to set) you can specify a callable that can produce the output
you want; whether you want to filter the items, count them, order them, etc.
We curried a few common ones for you, for your convenience:
from unbox import imports_for
imports_for.counter # imported names and their counts
imports_for.most_common # imported names and their counts, ordered by most common
imports_for.first_level # set for imported first level names (e.g. 'os' instead of 'os.path.etc.)
imports_for.first_level_count # count of imported first level names (e.g. 'os' instead of 'os.path.etc.)
imports_for.third_party # imported (first level) names that are not builtin names (most probably third party packages)"
Collections of python names
Check out the contents of these collections:
from unbox import (
builtin_module_names,
scanned_standard_lib_names,
all_accessible_modules,
all_accessible_pkg_names,
all_accessible_non_pkg_module_names,
builtin_obj_names,
python_names,
)
For example, builtin_module_names will be a set of names that are
documented and importable on your system.
The scanned_standard_lib_names set is similar, but the names are obtained by scanning
the local standard library file names -- so include things like easter eggs (this, antigravity).
all_accessible_modules will be the list of all modules accessible in your python path.
And so on...
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file unbox-0.1.12.tar.gz.
File metadata
- Download URL: unbox-0.1.12.tar.gz
- Upload date:
- Size: 28.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
57e06e190a4ab4a4704d1f55984753df01dbbb96e97acacd7c1ea093b5ee070e
|
|
| MD5 |
7b151757599c825a69df480572e1eedf
|
|
| BLAKE2b-256 |
3b48c2a8c0e17d51ae420ed1b4dfc0eb85435ff4b0ccc8a661f1bd08242b5be7
|
File details
Details for the file unbox-0.1.12-py3-none-any.whl.
File metadata
- Download URL: unbox-0.1.12-py3-none-any.whl
- Upload date:
- Size: 31.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
645e99a30a07d5e755c9492627062cc5128776894423fcc1ba68eee0a270066c
|
|
| MD5 |
599b4e7509758f9c79d8783b34af1a67
|
|
| BLAKE2b-256 |
574e2336a63b7ae8225d9e22e769ffde2fc4fc0c7c14a1b031a2fee673368ce7
|