/usr/lib/python3/dist-packages
NameSizeModeActions
acme/-0755rm
acme-1.1.0.egg-info/-0755rm
apport/-0755rm
apt/-0755rm
aptsources/-0755rm
apt_inst-stubs/-0755rm
apt_pkg-stubs/-0755rm
attr/-0755rm
attrs-19.3.0.egg-info/-0755rm
automat/-0755rm
Automat-0.8.0.egg-info/-0755rm
blinker/-0755rm
certbot/-0755rm
certbot-0.40.0.egg-info/-0755rm
certbot_nginx/-0755rm
certbot_nginx-0.40.0.egg-info/-0755rm
certifi/-0755rm
certifi-2019.11.28.egg-info/-0755rm
chardet/-0755rm
chardet-3.0.4.egg-info/-0755rm
click/-0755rm
Click-7.0.egg-info/-0755rm
cloudinit/-0755rm
cloud_init-23.1.2.egg-info/-0755rm
colorama/-0755rm
colorama-0.4.3.egg-info/-0755rm
CommandNotFound/-0755rm
ConfigArgParse-0.13.0.egg-info/-0755rm
configobj-5.0.6.egg-info/-0755rm
constantly/-0755rm
constantly-15.1.0.egg-info/-0755rm
cryptography/-0755rm
cryptography-2.8.egg-info/-0755rm
dbus/-0755rm
dbus_python-1.2.16.egg-info/-0755rm
debian/-0755rm
debian_bundle/-0755rm
distro-1.4.0.egg-info/-0755rm
distro_info-0.23ubuntu1.egg-info/-0755rm
DistUpgrade/-0755rm
future/-0755rm
future-0.18.2.egg-info/-0755rm
gi/-0755rm
hamcrest/-0755rm
httplib2/-0755rm
httplib2-0.14.0.egg-info/-0755rm
HweSupportStatus/-0755rm
hyperlink/-0755rm
hyperlink-19.0.0.egg-info/-0755rm
icu/-0755rm
idna/-0755rm
idna-2.8.egg-info/-0755rm
importlib_metadata/-0755rm
importlib_metadata-1.5.0.egg-info/-0755rm
incremental/-0755rm
incremental-16.10.1.egg-info/-0755rm
janitor/-0755rm
jinja2/-0755rm
Jinja2-2.10.1.egg-info/-0755rm
josepy/-0755rm
josepy-1.2.0.egg-info/-0755rm
jsonpatch-1.22.egg-info/-0755rm
jsonpointer-2.0.egg-info/-0755rm
jsonschema/-0755rm
jsonschema-3.2.0.egg-info/-0755rm
jwt/-0755rm
keyring/-0755rm
keyring-18.0.1.egg-info/-0755rm
landscape/-0755rm
LanguageSelector/-0755rm
language_selector-0.1.egg-info/-0755rm
launchpadlib/-0755rm
launchpadlib-1.10.13.egg-info/-0755rm
lazr/-0755rm
lazr.restfulclient-0.14.2.egg-info/-0755rm
lazr.uri-1.0.3.egg-info/-0755rm
libfuturize/-0755rm
libpasteurize/-0755rm
markupsafe/-0755rm
MarkupSafe-1.1.0.egg-info/-0755rm
mock/-0755rm
mock-3.0.5.egg-info/-0755rm
more_itertools/-0755rm
more_itertools-4.2.0.egg-info/-0755rm
nacl/-0755rm
netifaces-0.10.4.egg-info/-0755rm
oauthlib/-0755rm
oauthlib-3.1.0.egg-info/-0755rm
OpenSSL/-0755rm
parsedatetime/-0755rm
parsedatetime-2.4.egg-info/-0755rm
past/-0755rm
pbr/-0755rm
pbr-5.4.5.egg-info/-0755rm
pexpect/-0755rm
pkg_resources/-0755rm
ptyprocess/-0755rm
pyasn1/-0755rm
pyasn1-0.4.2.egg-info/-0755rm
pyasn1_modules/-0755rm
PyGObject-3.36.0.egg-info/-0755rm
pygtkcompat/-0755rm
PyHamcrest-1.9.0.egg-info/-0755rm
PyJWT-1.7.1.egg-info/-0755rm
pymacaroons/-0755rm
pymacaroons-0.13.0.egg-info/-0755rm
PyNaCl-1.3.0.egg-info/-0755rm
pyOpenSSL-19.0.0.egg-info/-0755rm
pyparsing-2.4.6.egg-info/-0755rm
pyrfc3339/-0755rm
pyRFC3339-1.1.egg-info/-0755rm
pyrsistent/-0755rm
pyrsistent-0.15.5.egg-info/-0755rm
pyserial-3.4.egg-info/-0755rm
python_apt-2.0.0+ubuntu0.20.4.3.egg-info/-0755rm
python_debian-0.1.36ubuntu1.egg-info/-0755rm
pytz/-0755rm
pytz-2019.3.egg-info/-0755rm
requests/-0755rm
requests-2.22.0.egg-info/-0755rm
requests_toolbelt/-0755rm
requests_toolbelt-0.8.0.egg-info/-0755rm
requests_unixsocket/-0755rm
requests_unixsocket-0.2.0.egg-info/-0755rm
secretstorage/-0755rm
SecretStorage-2.3.1.egg-info/-0755rm
serial/-0755rm
service_identity/-0755rm
service_identity-18.1.0.egg-info/-0755rm
setuptools/-0755rm
setuptools-45.2.0.egg-info/-0755rm
simplejson/-0755rm
six-1.14.0.egg-info/-0755rm
softwareproperties/-0755rm
sos/-0755rm
ssh_import_id/-0755rm
ssh_import_id-5.10.egg-info/-0755rm
systemd/-0755rm
twisted/-0755rm
Twisted-18.9.0.egg-info/-0755rm
uaclient/-0755rm
ubuntu_advantage_tools-20.3.egg-info/-0755rm
ufw/-0755rm
unattended_upgrades-0.1.egg-info/-0755rm
UpdateManager/-0755rm
urllib3/-0755rm
urllib3-1.25.8.egg-info/-0755rm
wadllib/-0755rm
wadllib-1.3.3.egg-info/-0755rm
yaml/-0755rm
zipp-1.0.0.egg-info/-0755rm
zope/-0755rm
zope.component-4.3.0.egg-info/-0755rm
zope.event-4.4.egg-info/-0755rm
zope.hookable-5.0.0.egg-info/-0755rm
zope.interface-4.7.1.egg-info/-0755rm
__pycache__/-0755rm
apport_python_hook.py80630644editdlrm
apt_inst.cpython-38-x86_64-linux-gnu.so600800644editdlrm
apt_pkg.cpython-38-x86_64-linux-gnu.so3593760644editdlrm
blinker-1.4.egg-info39010644editdlrm
command_not_found-0.3.egg-info1890644editdlrm
configargparse.py414460644editdlrm
configobj.py896130644editdlrm
deb822.py2730644editdlrm
debconf.py67690644editdlrm
distro.py432510644editdlrm
distro_info.py111550644editdlrm
easy_install.py1260644editdlrm
entrypoints.egg-info2260644editdlrm
entrypoints.py81840644editdlrm
jsonpatch.py250940644editdlrm
jsonpointer.py97960644editdlrm
language_support_pkgs.py99300644editdlrm
lsb_release.py149010644editdlrm
netifaces.cpython-38-x86_64-linux-gnu.so232240644editdlrm
netifaces.cpython-38d-x86_64-linux-gnu.so273520644editdlrm
pexpect-4.6.0.egg-info22850644editdlrm
problem_report.py268670644editdlrm
pvectorc.cpython-38-x86_64-linux-gnu.so375600644editdlrm
pyasn1_modules-0.2.1.egg-info17220644editdlrm
PyICU-2.4.2.egg-info106920644editdlrm
PyICU.py14630644editdlrm
pyparsing.py2724000644editdlrm
PyYAML-5.3.1.egg-info17810644editdlrm
simplejson-3.16.0.egg-info30390644editdlrm
six.py340740644editdlrm
snack.py311340644editdlrm
sos-4.3.egg-info2950644editdlrm
systemd_python-234.egg-info5860644editdlrm
ufw-0.36.egg-info2610644editdlrm
validate.py472430644editdlrm
zipp.py69140644editdlrm
zope.component-4.3.0-nspkg.pth5290644editdlrm
zope.event-4.4-nspkg.pth5290644editdlrm
zope.hookable-5.0.0-nspkg.pth5290644editdlrm
zope.interface-4.7.1-nspkg.pth5290644editdlrm
_cffi_backend.cpython-38-x86_64-linux-gnu.so1862880644editdlrm
_dbus_bindings.cpython-38-x86_64-linux-gnu.so1721920644editdlrm
_dbus_glib_bindings.cpython-38-x86_64-linux-gnu.so230800644editdlrm
_icu.cpython-38-x86_64-linux-gnu.so11484080644editdlrm
_pyrsistent_version.py230644editdlrm
_snack.cpython-38-x86_64-linux-gnu.so438000644editdlrm
_version.py210644editdlrm
_yaml.cpython-38-x86_64-linux-gnu.so2833760644editdlrm
Edit: /usr/lib/python3/dist-packages/entrypoints.py (8184B)
"""Discover and load entry points from installed packages.""" # Copyright (c) Thomas Kluyver and contributors # Distributed under the terms of the MIT license; see LICENSE file. from contextlib import contextmanager import glob from importlib import import_module import io import itertools import os.path as osp import re import sys import warnings import zipfile import configparser entry_point_pattern = re.compile(r""" (?P\w+(\.\w+)*) (:(?P\w+(\.\w+)*))? \s* (\[(?P.+)\])? $ """, re.VERBOSE) file_in_zip_pattern = re.compile(r""" (?P[^/\\]+)\.(dist|egg)-info [/\\]entry_points.txt$ """, re.VERBOSE) __version__ = '0.3' class BadEntryPoint(Exception): """Raised when an entry point can't be parsed. """ def __init__(self, epstr): self.epstr = epstr def __str__(self): return "Couldn't parse entry point spec: %r" % self.epstr @staticmethod @contextmanager def err_to_warnings(): try: yield except BadEntryPoint as e: warnings.warn(str(e)) class NoSuchEntryPoint(Exception): """Raised by :func:`get_single` when no matching entry point is found.""" def __init__(self, group, name): self.group = group self.name = name def __str__(self): return "No {!r} entry point found in group {!r}".format(self.name, self.group) class CaseSensitiveConfigParser(configparser.ConfigParser): optionxform = staticmethod(str) class EntryPoint(object): def __init__(self, name, module_name, object_name, extras=None, distro=None): self.name = name self.module_name = module_name self.object_name = object_name self.extras = extras self.distro = distro def __repr__(self): return "EntryPoint(%r, %r, %r, %r)" % \ (self.name, self.module_name, self.object_name, self.distro) def load(self): """Load the object to which this entry point refers. """ mod = import_module(self.module_name) obj = mod if self.object_name: for attr in self.object_name.split('.'): obj = getattr(obj, attr) return obj @classmethod def from_string(cls, epstr, name, distro=None): """Parse an entry point from the syntax in entry_points.txt :param str epstr: The entry point string (not including 'name =') :param str name: The name of this entry point :param Distribution distro: The distribution in which the entry point was found :rtype: EntryPoint :raises BadEntryPoint: if *epstr* can't be parsed as an entry point. """ m = entry_point_pattern.match(epstr) if m: mod, obj, extras = m.group('modulename', 'objectname', 'extras') if extras is not None: extras = re.split(r',\s*', extras) return cls(name, mod, obj, extras, distro) else: raise BadEntryPoint(epstr) class Distribution(object): def __init__(self, name, version): self.name = name self.version = version def __repr__(self): return "Distribution(%r, %r)" % (self.name, self.version) def iter_files_distros(path=None, repeated_distro='first'): if path is None: path = sys.path # Distributions found earlier in path will shadow those with the same name # found later. If these distributions used different module names, it may # actually be possible to import both, but in most cases this shadowing # will be correct. distro_names_seen = set() for folder in path: if folder.rstrip('/\\').endswith('.egg'): # Gah, eggs egg_name = osp.basename(folder) if '-' in egg_name: distro = Distribution(*egg_name.split('-')[:2]) if (repeated_distro == 'first') \ and (distro.name in distro_names_seen): continue distro_names_seen.add(distro.name) else: distro = None if osp.isdir(folder): ep_path = osp.join(folder, 'EGG-INFO', 'entry_points.txt') if osp.isfile(ep_path): cp = CaseSensitiveConfigParser(delimiters=('=',)) cp.read([ep_path]) yield cp, distro elif zipfile.is_zipfile(folder): z = zipfile.ZipFile(folder) try: info = z.getinfo('EGG-INFO/entry_points.txt') except KeyError: continue cp = CaseSensitiveConfigParser(delimiters=('=',)) with z.open(info) as f: fu = io.TextIOWrapper(f) cp.read_file(fu, source=osp.join(folder, 'EGG-INFO', 'entry_points.txt')) yield cp, distro # zip imports, not egg elif zipfile.is_zipfile(folder): with zipfile.ZipFile(folder) as zf: for info in zf.infolist(): m = file_in_zip_pattern.match(info.filename) if not m: continue distro_name_version = m.group('dist_version') if '-' in distro_name_version: distro = Distribution(*distro_name_version.split('-', 1)) if (repeated_distro == 'first') \ and (distro.name in distro_names_seen): continue distro_names_seen.add(distro.name) else: distro = None cp = CaseSensitiveConfigParser(delimiters=('=',)) with zf.open(info) as f: fu = io.TextIOWrapper(f) cp.read_file(fu, source=osp.join(folder, info.filename)) yield cp, distro # Regular file imports (not egg, not zip file) for path in itertools.chain( glob.iglob(osp.join(folder, '*.dist-info', 'entry_points.txt')), glob.iglob(osp.join(folder, '*.egg-info', 'entry_points.txt')) ): distro_name_version = osp.splitext(osp.basename(osp.dirname(path)))[0] if '-' in distro_name_version: distro = Distribution(*distro_name_version.split('-', 1)) if (repeated_distro == 'first') \ and (distro.name in distro_names_seen): continue distro_names_seen.add(distro.name) else: distro = None cp = CaseSensitiveConfigParser(delimiters=('=',)) cp.read([path]) yield cp, distro def get_single(group, name, path=None): """Find a single entry point. Returns an :class:`EntryPoint` object, or raises :exc:`NoSuchEntryPoint` if no match is found. """ for config, distro in iter_files_distros(path=path): if (group in config) and (name in config[group]): epstr = config[group][name] with BadEntryPoint.err_to_warnings(): return EntryPoint.from_string(epstr, name, distro) raise NoSuchEntryPoint(group, name) def get_group_named(group, path=None): """Find a group of entry points with unique names. Returns a dictionary of names to :class:`EntryPoint` objects. """ result = {} for ep in get_group_all(group, path=path): if ep.name not in result: result[ep.name] = ep return result def get_group_all(group, path=None): """Find all entry points in a group. Returns a list of :class:`EntryPoint` objects. """ result = [] for config, distro in iter_files_distros(path=path): if group in config: for name, epstr in config[group].items(): with BadEntryPoint.err_to_warnings(): result.append(EntryPoint.from_string(epstr, name, distro)) return result if __name__ == '__main__': import pprint pprint.pprint(get_group_all('console_scripts'))