/
usr
/
lib
/
python3
/
dist-packages
/
/usr/lib/python3/dist-packages
mkdir
upload
Name
Size
Mode
Actions
acme/
-
0755
rm
acme-1.1.0.egg-info/
-
0755
rm
apport/
-
0755
rm
apt/
-
0755
rm
aptsources/
-
0755
rm
apt_inst-stubs/
-
0755
rm
apt_pkg-stubs/
-
0755
rm
attr/
-
0755
rm
attrs-19.3.0.egg-info/
-
0755
rm
automat/
-
0755
rm
Automat-0.8.0.egg-info/
-
0755
rm
blinker/
-
0755
rm
certbot/
-
0755
rm
certbot-0.40.0.egg-info/
-
0755
rm
certbot_nginx/
-
0755
rm
certbot_nginx-0.40.0.egg-info/
-
0755
rm
certifi/
-
0755
rm
certifi-2019.11.28.egg-info/
-
0755
rm
chardet/
-
0755
rm
chardet-3.0.4.egg-info/
-
0755
rm
click/
-
0755
rm
Click-7.0.egg-info/
-
0755
rm
cloudinit/
-
0755
rm
cloud_init-23.1.2.egg-info/
-
0755
rm
colorama/
-
0755
rm
colorama-0.4.3.egg-info/
-
0755
rm
CommandNotFound/
-
0755
rm
ConfigArgParse-0.13.0.egg-info/
-
0755
rm
configobj-5.0.6.egg-info/
-
0755
rm
constantly/
-
0755
rm
constantly-15.1.0.egg-info/
-
0755
rm
cryptography/
-
0755
rm
cryptography-2.8.egg-info/
-
0755
rm
dbus/
-
0755
rm
dbus_python-1.2.16.egg-info/
-
0755
rm
debian/
-
0755
rm
debian_bundle/
-
0755
rm
distro-1.4.0.egg-info/
-
0755
rm
distro_info-0.23ubuntu1.egg-info/
-
0755
rm
DistUpgrade/
-
0755
rm
future/
-
0755
rm
future-0.18.2.egg-info/
-
0755
rm
gi/
-
0755
rm
hamcrest/
-
0755
rm
httplib2/
-
0755
rm
httplib2-0.14.0.egg-info/
-
0755
rm
HweSupportStatus/
-
0755
rm
hyperlink/
-
0755
rm
hyperlink-19.0.0.egg-info/
-
0755
rm
icu/
-
0755
rm
idna/
-
0755
rm
idna-2.8.egg-info/
-
0755
rm
importlib_metadata/
-
0755
rm
importlib_metadata-1.5.0.egg-info/
-
0755
rm
incremental/
-
0755
rm
incremental-16.10.1.egg-info/
-
0755
rm
janitor/
-
0755
rm
jinja2/
-
0755
rm
Jinja2-2.10.1.egg-info/
-
0755
rm
josepy/
-
0755
rm
josepy-1.2.0.egg-info/
-
0755
rm
jsonpatch-1.22.egg-info/
-
0755
rm
jsonpointer-2.0.egg-info/
-
0755
rm
jsonschema/
-
0755
rm
jsonschema-3.2.0.egg-info/
-
0755
rm
jwt/
-
0755
rm
keyring/
-
0755
rm
keyring-18.0.1.egg-info/
-
0755
rm
landscape/
-
0755
rm
LanguageSelector/
-
0755
rm
language_selector-0.1.egg-info/
-
0755
rm
launchpadlib/
-
0755
rm
launchpadlib-1.10.13.egg-info/
-
0755
rm
lazr/
-
0755
rm
lazr.restfulclient-0.14.2.egg-info/
-
0755
rm
lazr.uri-1.0.3.egg-info/
-
0755
rm
libfuturize/
-
0755
rm
libpasteurize/
-
0755
rm
markupsafe/
-
0755
rm
MarkupSafe-1.1.0.egg-info/
-
0755
rm
mock/
-
0755
rm
mock-3.0.5.egg-info/
-
0755
rm
more_itertools/
-
0755
rm
more_itertools-4.2.0.egg-info/
-
0755
rm
nacl/
-
0755
rm
netifaces-0.10.4.egg-info/
-
0755
rm
oauthlib/
-
0755
rm
oauthlib-3.1.0.egg-info/
-
0755
rm
OpenSSL/
-
0755
rm
parsedatetime/
-
0755
rm
parsedatetime-2.4.egg-info/
-
0755
rm
past/
-
0755
rm
pbr/
-
0755
rm
pbr-5.4.5.egg-info/
-
0755
rm
pexpect/
-
0755
rm
pkg_resources/
-
0755
rm
ptyprocess/
-
0755
rm
pyasn1/
-
0755
rm
pyasn1-0.4.2.egg-info/
-
0755
rm
pyasn1_modules/
-
0755
rm
PyGObject-3.36.0.egg-info/
-
0755
rm
pygtkcompat/
-
0755
rm
PyHamcrest-1.9.0.egg-info/
-
0755
rm
PyJWT-1.7.1.egg-info/
-
0755
rm
pymacaroons/
-
0755
rm
pymacaroons-0.13.0.egg-info/
-
0755
rm
PyNaCl-1.3.0.egg-info/
-
0755
rm
pyOpenSSL-19.0.0.egg-info/
-
0755
rm
pyparsing-2.4.6.egg-info/
-
0755
rm
pyrfc3339/
-
0755
rm
pyRFC3339-1.1.egg-info/
-
0755
rm
pyrsistent/
-
0755
rm
pyrsistent-0.15.5.egg-info/
-
0755
rm
pyserial-3.4.egg-info/
-
0755
rm
python_apt-2.0.0+ubuntu0.20.4.3.egg-info/
-
0755
rm
python_debian-0.1.36ubuntu1.egg-info/
-
0755
rm
pytz/
-
0755
rm
pytz-2019.3.egg-info/
-
0755
rm
requests/
-
0755
rm
requests-2.22.0.egg-info/
-
0755
rm
requests_toolbelt/
-
0755
rm
requests_toolbelt-0.8.0.egg-info/
-
0755
rm
requests_unixsocket/
-
0755
rm
requests_unixsocket-0.2.0.egg-info/
-
0755
rm
secretstorage/
-
0755
rm
SecretStorage-2.3.1.egg-info/
-
0755
rm
serial/
-
0755
rm
service_identity/
-
0755
rm
service_identity-18.1.0.egg-info/
-
0755
rm
setuptools/
-
0755
rm
setuptools-45.2.0.egg-info/
-
0755
rm
simplejson/
-
0755
rm
six-1.14.0.egg-info/
-
0755
rm
softwareproperties/
-
0755
rm
sos/
-
0755
rm
ssh_import_id/
-
0755
rm
ssh_import_id-5.10.egg-info/
-
0755
rm
systemd/
-
0755
rm
twisted/
-
0755
rm
Twisted-18.9.0.egg-info/
-
0755
rm
uaclient/
-
0755
rm
ubuntu_advantage_tools-20.3.egg-info/
-
0755
rm
ufw/
-
0755
rm
unattended_upgrades-0.1.egg-info/
-
0755
rm
UpdateManager/
-
0755
rm
urllib3/
-
0755
rm
urllib3-1.25.8.egg-info/
-
0755
rm
wadllib/
-
0755
rm
wadllib-1.3.3.egg-info/
-
0755
rm
yaml/
-
0755
rm
zipp-1.0.0.egg-info/
-
0755
rm
zope/
-
0755
rm
zope.component-4.3.0.egg-info/
-
0755
rm
zope.event-4.4.egg-info/
-
0755
rm
zope.hookable-5.0.0.egg-info/
-
0755
rm
zope.interface-4.7.1.egg-info/
-
0755
rm
__pycache__/
-
0755
rm
apport_python_hook.py
8063
0644
edit
dl
rm
apt_inst.cpython-38-x86_64-linux-gnu.so
60080
0644
edit
dl
rm
apt_pkg.cpython-38-x86_64-linux-gnu.so
359376
0644
edit
dl
rm
blinker-1.4.egg-info
3901
0644
edit
dl
rm
command_not_found-0.3.egg-info
189
0644
edit
dl
rm
configargparse.py
41446
0644
edit
dl
rm
configobj.py
89613
0644
edit
dl
rm
deb822.py
273
0644
edit
dl
rm
debconf.py
6769
0644
edit
dl
rm
distro.py
43251
0644
edit
dl
rm
distro_info.py
11155
0644
edit
dl
rm
easy_install.py
126
0644
edit
dl
rm
entrypoints.egg-info
226
0644
edit
dl
rm
entrypoints.py
8184
0644
edit
dl
rm
jsonpatch.py
25094
0644
edit
dl
rm
jsonpointer.py
9796
0644
edit
dl
rm
language_support_pkgs.py
9930
0644
edit
dl
rm
lsb_release.py
14901
0644
edit
dl
rm
netifaces.cpython-38-x86_64-linux-gnu.so
23224
0644
edit
dl
rm
netifaces.cpython-38d-x86_64-linux-gnu.so
27352
0644
edit
dl
rm
pexpect-4.6.0.egg-info
2285
0644
edit
dl
rm
problem_report.py
26867
0644
edit
dl
rm
pvectorc.cpython-38-x86_64-linux-gnu.so
37560
0644
edit
dl
rm
pyasn1_modules-0.2.1.egg-info
1722
0644
edit
dl
rm
PyICU-2.4.2.egg-info
10692
0644
edit
dl
rm
PyICU.py
1463
0644
edit
dl
rm
pyparsing.py
272400
0644
edit
dl
rm
PyYAML-5.3.1.egg-info
1781
0644
edit
dl
rm
simplejson-3.16.0.egg-info
3039
0644
edit
dl
rm
six.py
34074
0644
edit
dl
rm
snack.py
31134
0644
edit
dl
rm
sos-4.3.egg-info
295
0644
edit
dl
rm
systemd_python-234.egg-info
586
0644
edit
dl
rm
ufw-0.36.egg-info
261
0644
edit
dl
rm
validate.py
47243
0644
edit
dl
rm
zipp.py
6914
0644
edit
dl
rm
zope.component-4.3.0-nspkg.pth
529
0644
edit
dl
rm
zope.event-4.4-nspkg.pth
529
0644
edit
dl
rm
zope.hookable-5.0.0-nspkg.pth
529
0644
edit
dl
rm
zope.interface-4.7.1-nspkg.pth
529
0644
edit
dl
rm
_cffi_backend.cpython-38-x86_64-linux-gnu.so
186288
0644
edit
dl
rm
_dbus_bindings.cpython-38-x86_64-linux-gnu.so
172192
0644
edit
dl
rm
_dbus_glib_bindings.cpython-38-x86_64-linux-gnu.so
23080
0644
edit
dl
rm
_icu.cpython-38-x86_64-linux-gnu.so
1148408
0644
edit
dl
rm
_pyrsistent_version.py
23
0644
edit
dl
rm
_snack.cpython-38-x86_64-linux-gnu.so
43800
0644
edit
dl
rm
_version.py
21
0644
edit
dl
rm
_yaml.cpython-38-x86_64-linux-gnu.so
283376
0644
edit
dl
rm
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<modulename>\w+(\.\w+)*) (:(?P<objectname>\w+(\.\w+)*))? \s* (\[(?P<extras>.+)\])? $ """, re.VERBOSE) file_in_zip_pattern = re.compile(r""" (?P<dist_version>[^/\\]+)\.(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'))
Save
cmd:
run