Source code for pydeps.package_names
# -*- coding: utf-8 -*-
from __future__ import print_function
import os
import site
def _find_top_level_file(site_pkg_dir, pth):
if pth.endswith('.dist-info') or pth.endswith('.egg-info'):
top_level_fname = os.path.join(site_pkg_dir, pth, 'top_level.txt')
elif pth.endswith('.egg'):
top_level_fname = os.path.join(site_pkg_dir, pth, 'EGG-INFO', 'top_level.txt')
else:
top_level_fname = None
return top_level_fname
def _extract_pkg_name(pth):
name = pth.rsplit('.', 1)[0]
name_no_version = name.split('-', 1)[0]
return name_no_version.replace('_', '-')
[docs]
def find_package_names():
# initialize with well-known packages that don't seem to have a top_level.txt
res = {
'yaml': 'PyYAML',
'Crypto': 'pycrypto',
}
site_package_dirs = [site.getusersitepackages()]
site_package_dirs += site.getsitepackages()
for site_packages in reversed(site_package_dirs):
if not os.path.isdir(site_packages):
continue
for pth in os.listdir(site_packages):
top_level_fname = _find_top_level_file(site_packages, pth)
if top_level_fname is None:
continue
pkgname = _extract_pkg_name(pth)
if not os.path.exists(top_level_fname):
if pkgname not in res.values():
print("ERR:", pth, 'has not top_level.txt')
continue
with open(top_level_fname) as fp:
modnames = fp.read().split()
for modname in modnames:
modname = modname.replace('/', '.')
if modname.startswith(r'win32\lib'):
modname = modname.rsplit('\\')[1]
res[modname] = pkgname
return res
if __name__ == "__main__":
import json
print(json.dumps(find_package_names(), indent=4, sort_keys=True))