¿Cómo encontrar el “nombre de importación” de cualquier paquete en Python?

Me pregunto si hay alguna forma confiable y consistente de obtener el “nombre de importación” / espacio de nombres de un paquete Python. Por ejemplo;

Paquete ; django-haystack
Nombre de importación almiar

o

Paquete ; ipython
Nombre de importación IPython

Hasta ahora lo sé, PyPi no almacena esa información que he comprobado con PyPiXmlRpc.

También intenté automatizar para descargar el paquete, extraerlo y excavar el archivo .egg-info, pero algunos paquetes no tienen esa carpeta.

Cualquier ayuda será apreciada y se utilizará para un gadget de buena manera 🙂

Tenga en cuenta que lo que llama un paquete aquí no es un paquete sino una distribución . Una distribución puede contener cero o módulos módulos o paquetes. Eso significa que no hay una asignación de distribución de uno a uno a paquetes.

No estoy seguro de que exista una forma de detectar qué módulos y paquetes instalará una distribución, aparte de instalarlos y realizar introspecciones de los cambios en el sistema de archivos para paquetes, módulos y archivos pth recién agregados.

Ruedas

Sé que esta es una pregunta antigua, ¡pero los paquetes de ruedas ya se han inventado! Como una rueda es simplemente un archivo zip que se extrae en el directorio lib / site-packages, un examen de los contenidos del archivo de la rueda puede proporcionarle las importaciones de nivel superior.

>>> import zipfile >>> zf = zipfile.ZipFile('setuptools-35.0.2-py2.py3-none-any.whl') >>> top_level = set([x.split('/')[0] for x in z.namelist()]) >>> # filter out the .dist-info directory >>> top_level = [x for x in top_level if not x.endswith('.dist-info')] >>> top_level ['setuptools', 'pkg_resources', 'easy_install.py'] 

¡Así que setuptools en realidad te da tres importaciones de nivel superior!

descargar pip

pip ahora tiene un comando de descarga, por lo que puede simplemente pip download setuptools (o el paquete que desee) y luego examinarlo.

Invertir mirar hacia arriba

Lamentablemente no he encontrado una manera fácil de ir a la otra todavía. Es decir, dado el nombre de importación, cuál es el nombre del paquete. Esto puede ser un problema si está viendo algún código de ejemplo o tal vez si usa Anaconda que viene con un montón de paquetes preinstalados y quiere saber el nombre real del paquete.

En general, todo lo que necesita para obtener esa información está en el setup.py que se supone que está en cada paquete. Esa información sería aproximadamente la unión de los paquetes, py_modules, ext_package y ext_modules del objeto Distribución. De hecho, aquí hay un pequeño script que se burla de distutils.core.setup solo con el propósito de obtener esa información.

 import distutils.core distutils.core._setup_stop_after = "config" _real_setup = distutils.core.setup def _fake_setup(*args, **kwargs): global dist dist = _real_setup(*args, **kwargs) distutils.core.setup = _fake_setup import sys setup_file = sys.argv[1] sys.argv[:] = sys.argv[1:] import os.path os.chdir(os.path.dirname(setup_file)) execfile(os.path.basename(setup_file)) cat = lambda *seq: sum((i for i in seq if i is not None), []) pkgs = set(package.split('.')[0] for package in cat(dist.packages, dist.py_modules, [m.name for m in cat(dist.ext_modules)], [m.name for m in cat(dist.ext_package)])) print "\n".join(pkgs) 

Para muchos paquetes, esto funcionará como un amuleto, pero para un contraejemplo, vea numpy , se rompe porque numpy proporciona sus propios límites , y no veo una manera obvia de evitarlo .