es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtenga el nombre del archivo que sería generado por setup.py sdist, bdist_wheel, etc.

Estoy escribiendo un script en el que quiero comprobar la presencia de un sdist y una wheel para la versión actual de un paquete, antes de generarlos con Setuptools.

Sin embargo, los nombres de las wheels generadas tienden a ser algo complicados, y no es necesariamente una buena idea construirlos manualmente.

¿Es posible consultar de alguna manera a Setuptools el nombre de archivo (idealmente la ruta completa) que se usaría para un sdist o wheel?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible consultar Setuptools para obtener el nombre de archivo que se utilizaría para un sdist o wheel. Setuptools proporciona una función llamada get_distribution() que se puede utilizar para obtener información sobre la distribución de un paquete, incluido el nombre de archivo del formato de distribución.

    Para utilizar get_distribution(), primero deberás importarlo desde el módulo pkg_resources:

    from pkg_resources import get_distribution
    

    Luego, puedes usarlo para obtener información sobre la distribución de un paquete:

    dist = get_distribution('mi_paquete')
    

    El objeto dist que se devuelve contiene información sobre la distribución del paquete, incluido su nombre de archivo:

    >>> dist.project_name
    'mi_paquete'
    >>> dist.version
    '0.1.0'
    >>> dist.location
    '/ruta/hacia/mi_paquete'
    >>> dist.key
    'mi-paquete-0.1.0'
    >>> dist.has_metadata('METADATA')
    True
    >>> dist.get_metadata('METADATA')
    'name: mi-paquete\ntype: sdist\nversion: 0.1.0\nsummary: Un resumen corto\ndescription: Una descripción más larga\n'
    >>> dist.get_metadata_lines('RECORD')
    ['mi_paquete/__init__.py,sha256=XI0Hq3Y1cOv ...']
    >>> dist.get_metadata_lines('WHEEL')
    ['Wheel-Version: 1.0\n', 'Generator: bdist_wheel (version 0.35.1)\n', 'Root-Is-Purelib: true\n', 'Tag: py3-none-any\n']
    >>> dist.get_entry_map()['mi_paquete']['console_scripts']['mi_script']
    EntryPoint.parse('mi_script = mi_paquete.scripts.mi_script:main')
    >>> dist.has_metadata('INSTALLER')
    True
    >>> dist.get_metadata('INSTALLER')
    'pip 21.2.2 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)\n'
    

    Puedes utilizar esta información para determinar el nombre de archivo que se utilizaría para un sdist o wheel. Por ejemplo, para determinar el nombre de archivo del sdist:

    >>> dist.locate_file(f'dist/mi_paquete-0.1.0.tar.gz')
    '/ruta/hacia/mi_paquete/dist/mi_paquete-0.1.0.tar.gz'
    

    Y para determinar el nombre de archivo del wheel:

    >>> dist.locate_file(f'dist/mi_paquete-0.1.0-py3-none-any.whl')
    '/ruta/hacia/mi_paquete/dist/mi_paquete-0.1.0-py3-none-any.whl'
    

    Ten en cuenta que deberás haber construido las distribuciones antes de poder consultar sus nombres de archivo de esta manera. Si aún no las has construido, puedes utilizar los comandos bdist_wheel y sdist proporcionados por Setuptools para construirlas programáticamente:

    from setuptools.command.bdist_wheel import bdist_wheel
    from setuptools.command.sdist import sdist
    
    bdist_wheel_command = bdist_wheel(dist)
    bdist_wheel_command.run()
    
    sdist_command = sdist(dist)
    sdist_command.run()
    

    Después de ejecutar estos comandos, puedes utilizar get_distribution() y locate_file() como se describió anteriormente para determinar los nombres de archivo de las distribuciones recién construidas.

Comments are closed.