{"meta":{"title":"Creación y prueba de Python","intro":"Aprenda a crear un flujo de trabajo de integración continua (CI) para compilar y probar el proyecto de Python.","product":"GitHub Actions","breadcrumbs":[{"href":"/es/actions","title":"GitHub Actions"},{"href":"/es/actions/tutorials","title":"Tutoriales"},{"href":"/es/actions/tutorials/build-and-test-code","title":"Crea y prueba tu código"},{"href":"/es/actions/tutorials/build-and-test-code/python","title":"Python"}],"documentType":"article"},"body":"# Creación y prueba de Python\n\nAprenda a crear un flujo de trabajo de integración continua (CI) para compilar y probar el proyecto de Python.\n\n## Introducción\n\nEn esta guía se muestra cómo compilar, probar y publicar un paquete de Python.\n\nLos ejecutores hospedados en GitHub tienen un caché de herramientas con software pre-instalado, lo cual incluye a Python y PyPy. ¡No tienes que instalar nada! Para obtener una lista completa de up-to-date software y las versiones preinstaladas de Python y PyPy, consulte [Ejecutores hospedados en GitHub](/es/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software).\n\n## Requisitos previos\n\nDeberías estar familiarizado con YAML y la sintaxis para las GitHub Actions. Para más información, consulta [Escritura de flujos de trabajo](/es/actions/learn-github-actions).\n\nSe recomienda tener conocimientos básicos de Python y pip. Para más información, vea:\n\n* [Introducción a Python](https://www.python.org/about/gettingstarted/)\n* [Administrador de paquetes Pip](https://pypi.org/project/pip/)\n\n## Uso de una plantilla de flujo de trabajo de Python\n\nPara comenzar rápidamente, agregue una plantilla de flujo de trabajo al directorio `.github/workflows` del repositorio.\n\nGitHub ofrece una plantilla de flujo de trabajo para Python que debería funcionar si tu repositorio ya contiene al menos un archivo `.py`. En las secciones siguientes de esta guía se proporcionan ejemplos de cómo puede personalizar esta plantilla de flujo de trabajo.\n\n1. En GitHub, navegue hasta la página principal del repositorio.\n\n2. En el nombre del repositorio, haz clic en **<svg version=\"1.1\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" class=\"octicon octicon-play\" aria-label=\"play\" role=\"img\"><path d=\"M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z\"></path></svg> Actions**.\n\n   ![Captura de pantalla de las pestañas del repositorio \"github/docs\". La pestaña \"Proyectos\" aparece resaltada con un contorno naranja.](/assets/images/help/repository/actions-tab-global-nav-update.png)\n\n3. Si ya tiene un flujo de trabajo en su repositorio, haga clic en **New workflow** (Nuevo flujo de trabajo).\n\n4. En la página \"Elegir un flujo de trabajo\" se muestra una selección de plantillas de flujo de trabajo recomendadas. Busque \"Python aplicación\".\n\n5. En el flujo de trabajo \"aplicación Python\", haga clic en **Configure**.\n\n6. Edita el flujo de trabajo según sea necesario. Por ejemplo, cambie la versión de Python.\n\n7. Haga clic en **Commit changes** (Confirmar cambios).\n\nEl archivo de flujo de trabajo `python-app.yml` se agrega al directorio `.github/workflows` de tu repositorio.\n\n## Especificación de una versión de Python\n\nPara usar una versión preinstalada de Python o PyPy en un ejecutor hospedado por GitHub, use la acción `setup-python`. Esta acción busca una versión específica de Python o PyPy desde la memoria caché de herramientas de cada ejecutor y agrega los archivos binarios necesarios a `PATH`, que se conserva para el resto del trabajo. Si una versión específica de Python no está preinstalada en la memoria caché de herramientas, la acción `setup-python` descargará y configurará la versión adecuada del repositorio [`python-versions`](https://github.com/actions/python-versions).\n\nEl uso de la acción `setup-python` es la forma recomendada de usar Python con GitHub Actions porque garantiza un comportamiento coherente entre distintos ejecutores y versiones diferentes de Python. Si usa un ejecutor autohospedado, debe instalar Python y agregarlo a `PATH`. Para más información, vea la [acción `setup-python`](https://github.com/marketplace/actions/setup-python).\n\nLa tabla que aparece a continuación describe las ubicaciones de la caché de herramientas en cada ejecutor alojado GitHub.\n\n<div class=\"ghd-tool rowheaders\">\n\n|                                         | Ubuntu                          | Mac                                      | Windows                               |\n| --------------------------------------- | ------------------------------- | ---------------------------------------- | ------------------------------------- |\n| **Directorio de caché de herramientas** | `/opt/hostedtoolcache/*`        | `/Users/runner/hostedtoolcache/*`        | `C:\\hostedtoolcache\\windows\\*`        |\n| **Cache de herramientas de Python**     | `/opt/hostedtoolcache/Python/*` | `/Users/runner/hostedtoolcache/Python/*` | `C:\\hostedtoolcache\\windows\\Python\\*` |\n| **Caché de herramientas de PyPy**       | `/opt/hostedtoolcache/PyPy/*`   | `/Users/runner/hostedtoolcache/PyPy/*`   | `C:\\hostedtoolcache\\windows\\PyPy\\*`   |\n\n</div>\n\nSi está utilizando un ejecutor autohospedado, puede configurarlo para utilizar la acción `setup-python` para administrar sus dependencias. Para obtener más información, consulte [uso de setup-python con un ejecutor autohospedado](https://github.com/actions/setup-python#using-setup-python-with-a-self-hosted-runner) en el archivo README de `setup-python`.\n\nGitHub admite la sintaxis de control de versiones semántico. Para obtener más información, consulta [Uso del control de versiones semántico](https://docs.npmjs.com/about-semantic-versioning#using-semantic-versioning-to-specify-update-types-your-package-can-accept) y [Especificación del control de versiones semántico](https://semver.org/).\n\n### Uso de varias versiones de Python\n\nEn el ejemplo siguiente se usa una matriz para el trabajo para configurar varias versiones de Python. Para más información, consulta [Ejecución de variaciones de trabajos en un flujo de trabajo](/es/actions/using-jobs/using-a-matrix-for-your-jobs).\n\n```yaml copy\nname: Python package\n\non: [push]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        python-version: [\"pypy3.10\", \"3.9\", \"3.10\", \"3.11\", \"3.12\", \"3.13\"]\n\n    steps:\n      - uses: actions/checkout@v5\n      - name: Set up Python ${{ matrix.python-version }}\n        uses: actions/setup-python@v5\n        with:\n          python-version: ${{ matrix.python-version }}\n      # You can test your matrix by printing the current Python version\n      - name: Display Python version\n        run: python -c \"import sys; print(sys.version)\"\n```\n\n### Uso de una versión de Python específica\n\nPuede configurar una versión específica de Python. Por ejemplo, 3.12. Como alternativa, puedes utilizar una sintaxis de versión semántica para obtener la versión menor más reciente. En este ejemplo se usa la versión secundaria más reciente de Python 3.\n\n```yaml copy\nname: Python package\n\non: [push]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v5\n      - name: Set up Python\n        # This is the version of the action for setting up Python, not the Python version.\n        uses: actions/setup-python@v5\n        with:\n          # Semantic version range syntax or exact version of a Python version\n          python-version: '3.x'\n          # Optional - x64 or x86 architecture, defaults to x64\n          architecture: 'x64'\n      # You can test your matrix by printing the current Python version\n      - name: Display Python version\n        run: python -c \"import sys; print(sys.version)\"\n```\n\n### Excluir una versión\n\nSi especifica una versión de Python que no está disponible, `setup-python` produce un error como: `##[error]Version 3.7 with arch x64 not found`. El mensaje de error incluye las versiones disponibles.\n\nTambién puede usar la palabra clave `exclude` en el flujo de trabajo si hay una configuración de Python que no desea ejecutar. Para más información, consulta [Sintaxis del flujo de trabajo para GitHub Actions](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategy).\n\n```yaml copy\nname: Python package\n\non: [push]\n\njobs:\n  build:\n\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n        os: [ubuntu-latest, macos-latest, windows-latest]\n        python-version: [\"3.9\", \"3.11\", \"3.13\", \"pypy3.10\"]\n        exclude:\n          - os: macos-latest\n            python-version: \"3.11\"\n          - os: windows-latest\n            python-version: \"3.11\"\n```\n\n### Uso de la versión predeterminada de Python\n\nSe recomienda usar `setup-python` para configurar la versión de Python usada en los flujos de trabajo, ya que ayuda a que las dependencias sean explícitas. Si no usa `setup-python`, la versión predeterminada de Python establecida en `PATH` se usa en cualquier shell al llamar a `python`. La versión predeterminada de Python varía entre los ejecutores hospedados por GitHub, lo que puede provocar cambios inesperados o el uso de una versión anterior a la esperada.\n\n| Ejecutor alojado de GitHub | Descripción                                                                                                                                                                                                                                                                                                                                                                                       |\n| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Ubuntu                     | Los ejecutores de Ubuntu tienen varias versiones del sistema Python instaladas en `/usr/bin/python` y `/usr/bin/python3`. Las versiones de Python que vienen empaquetadas con Ubuntu son adicionales a las versiones que GitHub instala en la caché de herramientas.                                                                                                                              |\n| Windows                    | Excluyendo las versiones de Python que se encuentran en el caché de herramientas, Windows no se suministra con una versión equivalente de Python del sistema operativo. Para mantener un comportamiento uniforme con otros ejecutores y para permitir que Python se use de forma integrada sin la acción `setup-python`, GitHub agrega algunas versiones desde la caché de herramientas a `PATH`. |\n| macOS                      | Los ejecutores de macOS tienen más de una versión del sistema Python instaladas, además de las versiones que forman parte de la caché de herramientas. Las versiones de Python del sistema se encuentran en el directorio `/usr/local/Cellar/python/*`.                                                                                                                                           |\n\n## Instalación de dependencias\n\nLos ejecutores alojados de GitHub tienen el administrador de paquetes pip instalado. Puedes usar pip para instalar dependencias desde el registro del paquete de PyPI antes de construir y probar tu código. Por ejemplo, el YAML siguiente instala o actualiza el instalador de paquetes `pip` y los paquetes `setuptools` y `wheel`.\n\nTambién puede almacenar en caché sus dependencias para acelerar su flujo de trabajo. Para más información, consulta [Referencia de almacenamiento en caché de dependencias](/es/actions/using-workflows/caching-dependencies-to-speed-up-workflows).\n\n```yaml copy\nsteps:\n- uses: actions/checkout@v5\n- name: Set up Python\n  uses: actions/setup-python@v5\n  with:\n    python-version: '3.x'\n- name: Install dependencies\n  run: python -m pip install --upgrade pip setuptools wheel\n```\n\n### Archivo de requisitos\n\nDespués de actualizar `pip`, el siguiente paso típico consiste en instalar dependencias desde `requirements.txt`. Para obtener más información, consulte [pip](https://pip.pypa.io/en/stable/cli/pip_install/#example-requirements-file).\n\n```yaml copy\nsteps:\n- uses: actions/checkout@v5\n- name: Set up Python\n  uses: actions/setup-python@v5\n  with:\n    python-version: '3.x'\n- name: Install dependencies\n  run: |\n    python -m pip install --upgrade pip\n    pip install -r requirements.txt\n```\n\n### Dependencias de almacenamiento en caché\n\nPuedes almacenar en caché y restaurar las dependencias mediante la [acción `setup-python`](https://github.com/actions/setup-python).\n\nEl siguiente ejemplo guarda las dependencias en caché para pip.\n\n```yaml copy\nsteps:\n- uses: actions/checkout@v5\n- uses: actions/setup-python@v5\n  with:\n    python-version: '3.12'\n    cache: 'pip'\n- run: pip install -r requirements.txt\n- run: pip test\n```\n\nDe manera predeterminada, la acción `setup-python` busca el archivo de dependencias (`requirements.txt` para pip, `Pipfile.lock` para pipenvo o `poetry.lock` para poetry) en todo el repositorio. Para obtener más información, consulte [Almacenamiento en caché de dependencias de paquetes](https://github.com/actions/setup-python#caching-packages-dependencies) en el archivo LÉAME de `setup-python`.\n\nSi tiene una necesidad específica o necesita controles más precisos para el almacenamiento en caché, puede usar la [acción `cache`](https://github.com/marketplace/actions/cache). Pip almacena en caché las dependencias en diferentes ubicaciones, en función del sistema operativo del ejecutor. La ruta que necesitarás para almacenar en caché puede diferir del ejemplo de Ubuntu que se muestra anteriormente, según el sistema operativo que uses. Para obtener más información, consulte [ejemplos de almacenamiento en caché de Python](https://github.com/actions/cache/blob/main/examples.md#python---pip) en el repositorio de acciones de `cache`.\n\n## Probar el código\n\nPuedes usar los mismos comandos que usas de forma local para construir y probar tu código.\n\n### Pruebas con pytest y pytest-cov\n\nEn este ejemplo se instalan o actualizan `pytest` y `pytest-cov`. A continuación, se ejecutan las pruebas que se presentan en formato JUnit, mientras que los resultados de la cobertura de código se generan en Cobertura. Para obtener más información, consulte [JUnit](https://junit.org/junit5/) y [Cobertura](https://cobertura.github.io/cobertura/).\n\n```yaml copy\nsteps:\n- uses: actions/checkout@v5\n- name: Set up Python\n  uses: actions/setup-python@v5\n  with:\n    python-version: '3.x'\n- name: Install dependencies\n  run: |\n    python -m pip install --upgrade pip\n    pip install -r requirements.txt\n- name: Test with pytest\n  run: |\n    pip install pytest pytest-cov\n    pytest tests.py --doctest-modules --junitxml=junit/test-results.xml --cov=com --cov-report=xml --cov-report=html\n```\n\n### Uso de Ruff para hacer lint y/o formatear código\n\nEn el ejemplo siguiente se instala o actualiza `ruff` y se usa para ejecutar el linting en todos los archivos. Para más información, consulta [Ruff](https://docs.astral.sh/ruff).\n\n```yaml copy\nsteps:\n- uses: actions/checkout@v5\n- name: Set up Python\n  uses: actions/setup-python@v5\n  with:\n    python-version: '3.x'\n- name: Install the code linting and formatting tool Ruff\n  run: pipx install ruff\n- name: Lint code with Ruff\n  run: ruff check --output-format=github --target-version=py39\n- name: Check code formatting with Ruff\n  run: ruff format --diff --target-version=py39\n  continue-on-error: true\n```\n\nEl paso de formateado tiene establecido `continue-on-error: true`. Esto evitará que el flujo de trabajo falle si el paso de formateo no tiene éxito. Una vez que hayas abordado todos los errores de formato, puedes eliminar esta opción para que el flujo de trabajo detecte problemas nuevos.\n\n### Ejecutar pruebas con tox\n\nCon GitHub Actions, puedes ejecutar pruebas con tox y repartir el trabajo a través de múltiples trabajos. Tendrá que invocar tox mediante la opción `-e py` para elegir la versión de Python en su `PATH`, en lugar de indicar una versión específica. Para obtener más información, consulte [tox](https://tox.readthedocs.io/en/latest/).\n\n```yaml copy\nname: Python package\n\non: [push]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        python: [\"3.9\", \"3.11\", \"3.13\"]\n\n    steps:\n      - uses: actions/checkout@v5\n      - name: Setup Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: ${{ matrix.python }}\n      - name: Install tox and any other packages\n        run: pip install tox\n      - name: Run tox\n        # Run tox using the version of Python in `PATH`\n        run: tox -e py\n```\n\n## Empaquetar datos de flujo de trabajo como artefactos\n\nPuedes cargar artefactos para ver después de que se complete un flujo de trabajo. Por ejemplo, es posible que debas guardar los archivos de registro, los vaciados de memoria, los resultados de las pruebas o las capturas de pantalla. Para más información, consulta [Almacenamiento y uso compartido de datos con artefactos de flujo de trabajo](/es/actions/using-workflows/storing-workflow-data-as-artifacts).\n\nEn el ejemplo siguiente se muestra cómo puede usar la acción `upload-artifact` para archivar los resultados de la prueba después de ejecutar `pytest`. Para más información, vea la [acción `upload-artifact`](https://github.com/actions/upload-artifact).\n\n```yaml copy\nname: Python package\n\non: [push]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        python-version: [\"3.9\", \"3.10\", \"3.11\", \"3.12\", \"3.13\"]\n\n    steps:\n      - uses: actions/checkout@v5\n      - name: Setup Python # Set Python version\n        uses: actions/setup-python@v5\n        with:\n          python-version: ${{ matrix.python-version }}\n      # Install pip and pytest\n      - name: Install dependencies\n        run: |\n          python -m pip install --upgrade pip\n          pip install pytest\n      - name: Test with pytest\n        run: pytest tests.py --doctest-modules --junitxml=junit/test-results-${{ matrix.python-version }}.xml\n      - name: Upload pytest test results\n        uses: actions/upload-artifact@v4\n        with:\n          name: pytest-results-${{ matrix.python-version }}\n          path: junit/test-results-${{ matrix.python-version }}.xml\n        # Use always() to always run this step to publish test results when there are test failures\n        if: ${{ always() }}\n```\n\n## Publicación en PyPI\n\nPuede configurar el flujo de trabajo para publicar el paquete de Python en PyPI una vez superadas las pruebas de CI. En esta sección se muestra cómo puede usar GitHub Actions para cargar el paquete en PyPI cada vez que publique una versión. Para más información, consulta [Administrar lanzamientos en un repositorio](/es/repositories/releasing-projects-on-github/managing-releases-in-a-repository).\n\nEn el flujo de trabajo de ejemplo siguiente se usa [publicación de confianza](https://docs.pypi.org/trusted-publishers/) para autenticarse con PyPI, lo que elimina la necesidad de un token de API configurado manualmente.\n\n```yaml copy\n# Este flujo de trabajo usa acciones que no GitHub no certifica.\n# Estas las proporcionan entidades terceras y las gobiernan\n# condiciones de servicio, políticas de privacidad y documentación de soporte\n# en línea.\n\n# GitHub recomienda anclar acciones a un SHA de confirmación.\n# Para obtener una versión más reciente, debes actualizar el SHA.\n# También puedes hacer referencia a una etiqueta o rama, pero la acción puede cambiar sin ninguna advertencia.\n\nname: Upload Python Package\n\non:\n  release:\n    types: [published]\n\npermissions:\n  contents: read\n\njobs:\n  release-build:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v5\n\n      - uses: actions/setup-python@v5\n        with:\n          python-version: \"3.x\"\n\n      - name: Build release distributions\n        run: |\n          # NOTE: put your own distribution build steps here.\n          python -m pip install build\n          python -m build\n\n      - name: Upload distributions\n        uses: actions/upload-artifact@v4\n        with:\n          name: release-dists\n          path: dist/\n\n  pypi-publish:\n    runs-on: ubuntu-latest\n\n    needs:\n      - release-build\n\n    permissions:\n      # IMPORTANT: this permission is mandatory for trusted publishing\n      id-token: write\n\n    # Dedicated environments with protections for publishing are strongly recommended.\n    environment:\n      name: pypi\n      # OPTIONAL: uncomment and update to include your PyPI project URL in the deployment status:\n      # url: https://pypi.org/p/YOURPROJECT\n\n    steps:\n      - name: Retrieve release distributions\n        uses: actions/download-artifact@v5\n        with:\n          name: release-dists\n          path: dist/\n\n      - name: Publish release distributions to PyPI\n        uses: pypa/gh-action-pypi-publish@6f7e8d9c0b1a2c3d4e5f6a7b8c9d0e1f2a3b4c5d\n```\n\nPara obtener más información sobre este flujo de trabajo, incluida la configuración de PyPI necesaria, consulte [Configurar OpenID Connect en PyPI](/es/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-pypi)."}