Saltar a contenido

Tutorial 7 - Poner en marcha esta (tercera-)fiesta

Hasta ahora, la aplicación que hemos construido sólo ha utilizado nuestro propio código, además del código proporcionado por BeeWare. Sin embargo, en una aplicación del mundo real, es probable que desees utilizar una biblioteca de terceros, descargada desde el Python Package Index (PyPI).

Vamos a modificar nuestra aplicación para incluir una biblioteca de terceros.

Añadir un paquete

Modifiquemos nuestra aplicación para que diga algo más que "¡Hola!".

Para generar un texto más interesante para el diálogo, vamos a utilizar una biblioteca llamada Faker. Faker es un paquete de Python que genera contenido falso, incluyendo nombres y bloques de texto. Los nombres y las palabras del bloque de texto se generan a partir de una lista arbitraria de palabras proporcionada por Faker. Vamos a utilizar Faker para construir un mensaje falso, como si alguien estuviera respondiendo al usuario.

Vamos a comenzar añadiendo una faker a nuestra aplicación. Añade una importación al principio de app.py para importar a faker:

importar faker

Después modifica el manejador de eventos say_hello() tal que se vea como esto:

async def say_hello(self, widget):
      fake = faker.Faker()
      await self.main_window.dialog(
            toga.InfoDialog(
                 greeting(self.name_input.value),
                  f"Un mensaje de {fake.name()}: {fake.text()}",
             )
    )

Vamos a ejecutar nuestra aplicación actualizada en el modo de desarrollador de Portafolio para comprobar que nuestro cambio ha funcionado.

(beeware-venv) $ briefcase dev
Traceback (última invocación más reciente):
Archivo ".../venv/bin/briefcase", línea 5, en <module>
    from briefcase.__main__ import main
Archivo ".../venv/lib/python3.13/site-packages/briefcase/__main__.py", línea 3, en <module>
    from .cmdline import parse_cmdline
Archivo ".../venv/lib/python3.13/site-packages/briefcase/cmdline.py", línea 6, en <module>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Archivo ".../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py", línea 1, en <module>
    from .build import BuildCommand  # noqa
Archivo ".../venv/lib/python3.13/site-packages/briefcase/commands/build.py", línea 5, en <module>
    from .base import BaseCommand, full_options
Archivo ".../venv/lib/python3.13/site-packages/briefcase/commands/base.py", línea 14, en <module>
    import faker
ModuleNotFoundError: No existe ningún módulo llamado 'faker'
(beeware-venv) $ briefcase dev
Traceback (última invocación más reciente):
Archivo ".../venv/bin/briefcase", línea 5, en <module>
    from briefcase.__main__ import main
Archivo ".../venv/lib/python3.13/site-packages/briefcase/__main__.py", línea 3, en <module>
    from .cmdline import parse_cmdline
Archivo ".../venv/lib/python3.13/site-packages/briefcase/cmdline.py", línea 6, en <module>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Archivo ".../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py", línea 1, en <module>
    from .build import BuildCommand  # noqa
Archivo ".../venv/lib/python3.13/site-packages/briefcase/commands/build.py", línea 5, en <module>
    from .base import BaseCommand, full_options
Archivo ".../venv/lib/python3.13/site-packages/briefcase/commands/base.py", línea 14, en <module>
    import faker
ModuleNotFoundError: No existe ningún módulo llamado 'faker'
(beeware-venv) C:\...>briefcase dev
Traceback (última invocación más reciente):
Archivo "...\venv\bin\briefcase", línea 5, en <module>
    from briefcase.__main__ import main
Archivo "...\venv\lib\python3.13\site-packages\briefcase\__main__.py", línea 3, en <module>
    from .cmdline import parse_cmdline
Archivo "...\venv\lib\python3.13\site-packages\briefcase\cmdline.py", línea 6, en <module>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Archivo "...\venv\lib\python3.13\site-packages\briefcase\commands\__init__.py", línea 1, en <module>
    from .build import BuildCommand  # noqa
Archivo "...\venv\lib\python3.13\site-packages\briefcase\commands\build.py", línea 5, en <module>
    from .base import BaseCommand, full_options
Archivo "...\venv\lib\python3.13\site-packages\briefcase\commands\base.py", línea 14, en <module>
    import faker
ModuleNotFoundError: No existe ningún módulo llamado 'faker'

No puedes ejecutar una aplicación Android en modo desarrollador: utiliza las instrucciones para la plataforma de escritorio que hayas elegido.

No puedes ejecutar una aplicación para iOS en modo desarrollador: sigue las instrucciones de la plataforma de escritorio que hayas elegido.

¿Qué ha pasado? Hemos añadido faker a nuestro código, pero no lo hemos añadido al entorno virtual que se utiliza para ejecutar la aplicación en modo de desarrollo.

Cuando Briefcase ejecuta una aplicación en modo de desarrollo, crea un entorno virtual independiente para esa aplicación, independiente del entorno en el que se ejecuta briefcase. Si tu aplicación no declara que necesita una biblioteca concreta, dicha biblioteca no sería instalada en el entorno virtual de desarrollo.

Entonces, ¿cómo se añade un requisito nuevo a tu aplicación?

Actualización de las dependencias

En el directorio raíz de tu aplicación, hay un archivo llamado pyproject.toml. Este archivo contiene todos los detalles de configuración de la aplicación que proporcionaste cuando ejecutaste briefcase neworiginalmente.

pyproject.toml está separada en secciones; una de las secciones describe los ajustes para tu aplicación:

[tool.briefcase.app.helloworld]
form_name = "Hola Mundo"
description = "Una aplicación tutorial"
long_description = """Aquí se deben incluir más detalles sobre la aplicación.
"""
sources = ["src/helloworld"]
requires = []

La opción requires describe las dependencias de nuestra aplicación. Es un listado de cadenas que especifica las bibliotecas (y, opcionalmente, las versiones de las bibliotecas) que desea incluirse en su aplicación.

Modifique los ajustes requires tal que se lea:

requiere = [
    "faker",
]

Al añadir esta opción, le estamos diciendo a Briefcase «cuando compiles mi aplicación, ejecuta pip install httpx en el paquete de la aplicación». Cualquier cosa que sea una entrada legal para pip install se puede utilizar aquí —por lo que podría especificar:

  • Una versión específica de la biblioteca (p.ej., "faker=37.3.0");
  • Un intervalo de versiones de la biblioteca (p.ej., "faker>=37");
  • Una ruta a un repositorio git (p.ej., "git+https://github.com/joke2k/faker/"); o bien
  • Una ruta de archivo local (No obstante, ten cuidado: si proporcionas tu código a otra persona, ¡es probable que esta ruta no exista en su máquina!)

Más abajo en pyproject.toml, verás otras secciones que dependen del sistema operativo, como [tool.briefcase.app.helloworld.macOS] y [tool.briefcase.app.helloworld.windows]. Estas secciones también tienen un ajuste requires. Estas opciones te permiten definir dependencias adicionales específicas de la plataforma; así, p.ej., si necesitas una biblioteca específica de la plataforma para manejar algún aspecto de tu aplicación, puedes especificar esa biblioteca en la sección requires específica de la plataforma, y esa opción sólo se utilizará para esa plataforma. Notarás que las bibliotecas toga están todas especificadas en la sección requires específica de la plataforma: esto es porque las bibliotecas necesarias para mostrar una interfaz de usuario son específicas de la plataforma.

En nuestro caso, queremos que faker esté instalado en todas las plataformas, por lo que utilizamos el ajuste requires a nivel de aplicación. Las dependencias a nivel de aplicación siempre se instalarán; las dependencias específicas de la plataforma se instalan además de las dependencias a nivel de aplicación.

Una vez que hayas añadido el nuevo requisito, guarda pyproject.toml y ejecuta briefcase dev -r. El indicador -r le indica a Briefcase que los requisitos han cambiado y que es necesario actualizar el entorno virtual de desarrollo:

(beeware-venv) $ briefcase dev -r

[helloworld] Activando el entorno de desarrollo...
...
Recreando el entorno virtual (dev.cpython-313-darwin)... hecho

[hello-world] Instalando los requisitos...
...

[helloworld] Iniciando en modo de desarrollo...
===========================================================================

Cuando introduzcas un nombre y pulses el botón, deberías ver un diálogo parecido a algo como:

Diálogo Hola Mundo Tutorial 7, en macOS

/// subtítulo

///

(beeware-venv) $ briefcase dev -r

[helloworld] Activando el entorno de desarrollo...
...
Recreando el entorno virtual (dev.cpython-313-x86_64-linux-gnu)... hecho

[hello-world] Instalando requisitos...
...

[helloworld] Iniciando en modo dev...
===========================================================================

Cuando introduzcas un nombre y pulses el botón, deberías ver un diálogo parecido a algo como:

Diálogo de Hola Mundo Tutorial 7, en Linux

/// subtítulo

///

(beeware-venv) C:\...>briefcase dev -r

[helloworld] Activando el entorno de desarrollo...
...
Recreando el entorno virtual (dev.cp313-win_amd64)... hecho

[hello-world] Instalando requisitos...
...

[helloworld] Iniciando en modo dev...
===========================================================================

Cuando introduzcas un nombre y pulses el botón, deberías ver un diálogo parecido a algo como:

Diálogo de Hola Mundo Tutorial 7, en Windows

/// subtítulo

///

No puedes ejecutar una aplicación Android en modo desarrollador: utiliza las instrucciones para la plataforma de escritorio que hayas elegido.

No puedes ejecutar una aplicación para iOS en modo desarrollador: sigue las instrucciones de la plataforma de escritorio que hayas elegido.

Posibles errores al ejecutar briefcase dev

Si sigues obteniendo un error al ejecutar briefcase dev, asegúrate que:

  1. Has añadido faker a la lista requires en pyproject.toml;
  2. Has guardado tus cambios en pyproject.toml; y
  3. Incluiste el argumento -r al ejecutar briefcase dev -r.

La primera vez que ejecutas tu aplicación utilizando briefcase dev, el argumento -r se añade automáticamente, por eso no hemos tenido que utilizar el argumento -r hasta ahora. El argumento -r solo es necesario cuando añades, eliminas o cambias un requisito, después de ejecutar tu aplicación en modo de desarrollo. Si solo has actualizado el código, puedes ejecutar briefcase dev como hemos estado haciendo durante el resto de este tutorial.

Ejecutar la aplicación actualizada

Ahora tenemos una aplicación que funciona, utilizando una biblioteca de terceros, ejecutándose en modo de desarrollo. Vamos a empaquetar este código de aplicación actualizado como una aplicación independiente. Dado que hemos realizado cambios en el código, debemos seguir los mismos pasos que en el Tutorial 4:

Actualice el código en la aplicación empaquetada:

(beeware-venv) $ briefcase update

[helloworld] Actualizando el código de la aplicación...
...

[helloworld] Aplicación actualizada.

Reconstruye la aplicación:

(beeware-venv) $ briefcase build

[helloworld] Aplicación de firma ad hoc...
[helloworld] Se ha creado build/helloworld/macos/app/Hello World.app

Y, por último, ejecute la aplicación:

(beeware-venv) $ briefcase run

[helloworld] Iniciando la aplicación...
===========================================================================

Sin embargo, cuando la aplicación se ejecute, verás un error en la consola, además de un cuadro de diálogo de cuelgue:

Cuelgue en Hello World Tutorial 7, en macOS

/// subtítulo

///

Actualice el código en la aplicación empaquetada:

(beeware-venv) $ briefcase update

[helloworld] Actualizando el código de la aplicación...
...

[helloworld] Aplicación actualizada.

Reconstruye la aplicación:

(beeware-venv) $ briefcase build

[helloworld] Finalizando la configuración de la aplicación...
...

[helloworld] Generando la aplicación...
...

[helloworld] Generando en build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr/bin/helloworld

Y, por último, ejecute la aplicación:

(beeware-venv) $ briefcase run

[helloworld] Iniciando la aplicación...
===========================================================================

Sin embargo, cuando la aplicación se ejecute, verás un error en la consola:

Traceback (última llamada más reciente):
  Archivo "/usr/lib/python3.13/runpy.py", línea 194, en _run_module_as_main
    return _run_code(code, main_globals, None,
  Archivo "/usr/lib/python3.13/runpy.py", línea 87, en _run_code
    exec(code, run_globals)
  Archivo "/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/helloworld-0.0.1/usr/app/hello_world/__main__.py", línea 1, en <module>
    from helloworld.app import main
  Archivo "/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/helloworld-0.0.1/usr/app/hello_world/app.py", línea 8, en <módulo>
    import faker
ModuleNotFoundError: No existe ningún módulo llamado 'faker'

No se puede iniciar la aplicación helloworld.

Actualice el código en la aplicación empaquetada:

(beeware-venv) C:\...>briefcase update

[helloworld] Actualizando el código de la aplicación...
...

[helloworld] Aplicación actualizada.

Reconstruye la aplicación:

(beeware-venv) C:\...>briefcase build
...

[helloworld] Se ha compilado build\helloworld\windows\app\src\Toga Test.exe

Y, por último, ejecute la aplicación:

(beeware-venv) C:\...>briefcase run

[helloworld] Iniciando la aplicación...
===========================================================================

Sin embargo, cuando la aplicación se ejecute, verás un error en la consola, además de un cuadro de diálogo de cuelgue:

Cuelgue de aplicación Hello World Tutorial 7, en Windows

/// subtítulo

///

Actualice el código en la aplicación empaquetada:

(beeware-venv) $ briefcase update android

[helloworld] Actualizando el código de la aplicación...
...

[helloworld] Aplicación actualizada.

Reconstruye la aplicación:

(beeware-venv) $ briefcase build android

[helloworld] Actualizando los metadatos de la aplicación...
...
[helloworld] Compilado en build/helloworld/android/gradle/app/build/outputs/apk/debug/app-debug.apk

Por último, ejecute la aplicación (seleccionando un simulador cuando se le solicite):

(beeware-venv) $ briefcase run android

[helloworld] A continuación se muestra el registro del dispositivo (pulsa CTRL-C para detener el registro)...
===========================================================================

Sin embargo, cuando la aplicación se ejecute, verás un error en la consola:

--------- inicio del fallo
E/AndroidRuntime: EXCEPCIÓN FATAL: main
E/AndroidRuntime: Proceso: com.example.helloworld, PID: 8289
E/AndroidRuntime: java.lang.RuntimeException: No se puede iniciar la actividad ComponentInfo{com.example.helloworld/org.beeware.android.MainActivity}: com.chaquo.python.PyException: ModuleNotFoundError: No hay ningún módulo llamado «faker»
E/AndroidRuntime:   en android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
E/AndroidRuntime:   en android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
E/AndroidRuntime:   en android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
E/AndroidRuntime:   en android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
E/AndroidRuntime:   en android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
E/AndroidRuntime:   en android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
E/AndroidRuntime:   en android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime:   en android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime:   en android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime:   en android.app.ActivityThread.main(ActivityThread.java:7839)
E/AndroidRuntime:   en java.lang.reflect.Method.invoke(método nativo)
E/AndroidRuntime:   en com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/AndroidRuntime:   en com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
E/AndroidRuntime: Causado por: com.chaquo.python.PyException: ModuleNotFoundError: No se ha encontrado el módulo «faker»
E/AndroidRuntime:   en <python>.helloworld.app.<module>(app.py:8)
E/AndroidRuntime:   en <python>.java.chaquopy.import_override(import.pxi:60)
E/AndroidRuntime:   en <python>.__main__.<module>(__main__.py:1)
E/AndroidRuntime:   en <python>.runpy._run_code(<frozen runpy>:88)
E/AndroidRuntime:   en <python>.runpy._run_module_code(<frozen runpy>:98)
E/AndroidRuntime:   en <python>.runpy.run_module(<frozen runpy>:226)
E/AndroidRuntime:   en <python>.chaquopy_java.call(chaquopy_java.pyx:352)
E/AndroidRuntime:   en <python>.chaquopy_java.Java_com_chaquo_python_PyObject_callAttrThrowsNative(chaquopy_java.pyx:324)
E/AndroidRuntime:   en com.chaquo.python.PyObject.callAttrThrowsNative(método nativo)
E/AndroidRuntime:   en com.chaquo.python.PyObject.callAttrThrows(PyObject.java:232)
E/AndroidRuntime:   en com.chaquo.python.PyObject.callAttr(PyObject.java:221)
E/AndroidRuntime:   en org.beeware.android.MainActivity.onCreate(MainActivity.java:85)
E/AndroidRuntime:   en android.app.Activity.performCreate(Activity.java:8051)
E/AndroidRuntime:   en android.app.Activity.performCreate(Activity.java:8031)
E/AndroidRuntime:   en android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
E/AndroidRuntime:   en android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
E/AndroidRuntime:   ... 12 más
I/Proceso: Enviando señal. PID: 8289 SIG: 9

Actualice el código en la aplicación empaquetada:

(beeware-venv) $ briefcase update iOS

[helloworld] Actualizando el código de la aplicación...
...

[helloworld] Aplicación actualizada.

Reconstruye la aplicación:

(beeware-venv) $ briefcase build iOS

[helloworld] Actualizando los metadatos de la aplicación...
...
[helloworld] Compilado en build/helloworld/ios/xcode/build/Debug-iphonesimulator/Hello World.app

Por último, ejecute la aplicación (seleccionando un simulador cuando se le solicite):

(beeware-venv) $ briefcase run iOS

...
[helloworld] A continuación se muestra el registro del simulador (pulsa CTRL-C para detener el registro)...
===========================================================================

Sin embargo, cuando la aplicación se ejecute, verás un error en la consola

¡La aplicación se ha bloqueado!
========================
Traceback (última llamada más reciente):
  Archivo "/Users/rkm/Library/Developer/CoreSimulator/Devices/FD7EA28A-6D72-4064-9D8A-53CC8308BB6F/data/Containers/Bundle/Application/D9DD590B-DA32-4EE1-8F78-78658379CAB7/Hello World.app/app/helloworld/__main__.py", línea 1, en <módulo>
    from helloworld.app import main
  Archivo "/Users/rkm/Library/Developer/CoreSimulator/Devices/FD7EA28A-6D72-4064-9D8A-53CC8308BB6F/data/Containers/Bundle/Application/D9DD590B-DA32-4EE1-8F78-78658379CAB7/Hello World.app/app/helloworld/app.py", línea 8, en <módulo>
    import faker
ModuleNotFoundError: No existe ningún módulo llamado 'faker'

Una vez más, la aplicación no se inicia porque no se ha instalado faker, pero ¿por qué? ¿No hemos instalado ya faker?

Sí, pero solo en el entorno de desarrollo. Cada aplicación compilada también tiene su propio entorno independiente, que es uno de los elementos que Briefcase genera al ejecutar briefcase build. Cuando ejecutamos briefcase dev -r, añadimos faker a nuestro entorno de desarrollo, pero no a la aplicación empaquetada. También tenemos que ejecutar briefcase update -r para que Briefcase sepa que los requisitos de la aplicación empaquetada han cambiado:

(beeware-venv) $ briefcase update -r

[helloworld] Actualizando el código de la aplicación...
Instalando src/hello_world...

[helloworld] Actualizando los requisitos...
Recopilando faker
  Usando faker-37.3.0-py3-none-any.whl.metadata almacenado en caché (15 kB)
...
Instalando paquetes recopilados: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Instalados correctamente: faker-37.3.0, fonttools-4.58.1, rubicon-objc-0.5.1, std-nslog-1.0.3, toga-cocoa-0.5.1, toga-core-0.5.1, travertino-0.5.1, tzdata-2025.2

[helloworld] Eliminando contenido innecesario de la aplicación...
...

[helloworld] Aplicación actualizada.
(beeware-venv) $ briefcase update -r

[helloworld] Finalizando la configuración de la aplicación...
Seleccionando ubuntu:jammy (base del proveedor: Debian)
Determinando la versión de glibc... hecho
Seleccionando glibc 2.35
Seleccionando Python 3.13

[helloworld] Actualizando el código de la aplicación...
Instalando src/hello_world...

[helloworld] Actualizando los requisitos...
Recopilando faker
  Usando faker-37.3.0-py3-none-any.whl.metadata almacenado en caché (15 kB)
...
Instalando paquetes recopilados: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Instalados correctamente: faker-37.3.0, fonttools-4.58.1, rubicon-objc-0.5.1, std-nslog-1.0.3, toga-cocoa-0.5.1, toga-core-0.5.1, travertino-0.5.1, tzdata-2025.2

[helloworld] Eliminando contenido innecesario de la aplicación...
...

[helloworld] Aplicación actualizada.
(beeware-venv) C:\...>briefcase update -r

[helloworld] Actualizando el código de la aplicación...
Instalando src/helloworld...

[helloworld] Actualizando los requisitos...
Recopilando faker
  Usando faker-37.3.0-py3-none-any.whl.metadata almacenado en caché (15 kB)
...
Instalando paquetes recopilados: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Instalados correctamente: faker-37.3.0, fonttools-4.58.1, rubicon-objc-0.5.1, std-nslog-1.0.3, toga-cocoa-0.5.1, toga-core-0.5.1, travertino-0.5.1, tzdata-2025.2

[helloworld] Eliminando contenido innecesario de la aplicación...
...

[helloworld] Aplicación actualizada.
(beeware-venv) $ briefcase update android -r

[helloworld] Actualizando el código de la aplicación...
Instalando src/helloworld... hecho

[helloworld] Actualizando los requisitos...
Generando el archivo de requisitos... hecho

[helloworld] Eliminando contenido innecesario de la aplicación...
Eliminando contenido innecesario del paquete de la aplicación... hecho

[helloworld] Aplicación actualizada.
(beeware-venv) $ briefcase update iOS -r

[helloworld] Actualizando el código de la aplicación...
Instalando src/helloworld... hecho

[helloworld] Actualizando los requisitos...
Buscando en los índices: https://pypi.org/simple, https://pypi.anaconda.org/beeware/simple
Recopilando faker
  Usando faker-37.4.0-py3-none-any.whl.metadata almacenado en caché (15 kB)
...

Instalando requisitos de la aplicación para el simulador de iPhone... hecho

[helloworld] Eliminando contenido innecesario de la aplicación...
Eliminando contenido innecesario del paquete de la aplicación... hecho

[helloworld] Aplicación actualizada.

Una vez que haya actualizado, puede ejecutar briefcase build y briefcase run — y usted debe ver su aplicación empaquetada, con el nuevo comportamiento de diálogo.

Nota

La opción -r para actualizar los requisitos también es respetada por los comandos build y run, así que si quieres actualizar, construir y ejecutar en un solo paso, puedes usar briefcase run -u -r.

Paquetes Python de terceros para móviles y web

Faker es sólo un ejemplo de un paquete de Python de terceros —una colección de código que no es parte de lo que Python proporciona fuera de la caja—. Estos paquetes de terceros se distribuyen normalmente usando el Python Package Index (PyPI), y se instalan en tu entorno virtual local. En este tutorial hemos utilizado pip, pero existen otras opciones.

En plataformas de escritorio (macOS, Windows, Linux), básicamente cualquier paquete de PyPI se puede instalar en tu entorno virtual o añadir a los requisitos de tu aplicación. Sin embargo, al crear una aplicación para plataformas móviles o web, tus opciones son ligeramente limitadas.

En resumen; cualquier paquete puro Python (es decir, cualquier paquete creado a partir de un proyecto escrito sólo en Python) puede utilizarse sin dificultad. Algunos paquetes, sin embargo, se crean a partir de proyectos que contienen tanto Python como otros lenguajes (por ejemplo, C, C++, Rust, etc). El código escrito en esos lenguajes debe compilarse en módulos binarios específicos de la plataforma antes de poder utilizarse, y esos módulos binarios pre‐compilados sólo están disponibles en plataformas específicas. Las plataformas móviles y web tienen requisitos muy diferentes a los de las plataformas de escritorio "estándar". En este momento, la mayoría de los paquetes de Python no proporcionan binarios pre‐compilados para plataformas móviles y web.

En PyPI, los paquetes se proporcionan a menudo en un formato de distribución pre‐construido llamado wheels. Para comprobar si un paquete es Python puro, mira en la página de descargas PyPI del proyecto. Si los wheels proporcionados tienen el sufijo -py3-none-any.whl (p.e., Faker), entonces son wheels de Python puro. Sin embargo, si las ruedas tienen extensiones específicas de versión y plataforma (por ejemplo, Pillow, que tiene ruedas con sufijos como -cp313-cp313-macosx_11_0_arm64.whl y -cp39-cp39-win_amd64.whl), entonces la rueda contiene un componente binario. Ese paquete no puede instalarse en plataformas móviles o web a menos que se haya proporcionado una rueda compatible con esas plataformas.

En este momento, la mayoría de los paquetes binarios en PyPI no proporcionan ruedas compatibles con móviles o web. Para llenar este vacío, BeeWare proporciona binarios para algunos módulos binarios populares (incluyendo numpy, pandas, y cryptography). Estas ruedas no se distribuyen en PyPI, pero Briefcase instalará esas ruedas si están disponibles.

Es normalmente posible compilar paquetes binarios para plataformas móviles, pero no es fácil de configurar — fuera del alcance de un tutorial introductorio como éste.

Siguientes pasos

Ya tenemos una aplicación que utiliza una biblioteca de terceros. En el Tutorial 8 aprenderemos cómo asegurarnos de que nuestra aplicación sigue respondiendo a medida que añadimos lógica de aplicación más compleja.