Ir para o conteúdo

Tutorial 7 - A iniciar o uso de bibliotecas externas

Até o momento, a aplicação que criamos usou apenas o nosso próprio código, além do código fornecido pelo BeeWare. Entretanto, em um aplicação do mundo real, você provavelmente desejará usar uma biblioteca de terceiros, baixada do Python Package Index (PyPI).

Vamos modificar nossa aplicação para incluir uma biblioteca de terceiros.

Adição de um pacote

Vamos modificar nossa aplicação para dizer um pouco mais do que apenas "Hi, there!".

Para gerar um texto mais interessante para a caixa de diálogo, usaremos uma biblioteca chamada Faker. Faker é um pacote Python que gera conteúdo falso, incluindo nomes e blocos de texto. Os nomes e as palavras no bloco de texto são gerados a partir de uma lista arbitrária de palavras fornecidas pelo Faker. Vamos usar o Faker para construir uma mensagem falsa, como se alguém estivesse respondendo ao utilizador.

Vamos adicionar uma chamada de API httpx ao nossa aplicação. Adicione uma importação na parte superior do app.py para importar httpx:

importar faker

Para tornar nosso tutorial assíncrono, modifique o manipulador de eventos say_hello() para que ele tenha a seguinte aparência:

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

Vamos executar nossa aplicação atualizado no modo de desenvolvedor do Briefcase para verificar se nossa alteração funcionou.

(beeware-venv) $ briefcase dev
Traceback (última chamada mais recente):
Arquivo ".../venv/bin/briefcase", linha 5, em <module>
    from briefcase.__main__ import main
Arquivo ".../venv/lib/python3.13/site-packages/briefcase/__main__.py", linha 3, em <módulo>
    from .cmdline import parse_cmdline
Arquivo ".../venv/lib/python3.13/site-packages/briefcase/cmdline.py", linha 6, em <módulo>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Arquivo ".../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py", linha 1, em <módulo>
    from .build import BuildCommand  # noqa
Arquivo ".../venv/lib/python3.13/site-packages/briefcase/commands/build.py", linha 5, em <module>
    from .base import BaseCommand, full_options
Arquivo ".../venv/lib/python3.13/site-packages/briefcase/commands/base.py", linha 14, em <módulo>
    import faker
ModuleNotFoundError: Nenhum módulo chamado 'faker'
(beeware-venv) $ briefcase dev
Traceback (última chamada mais recente):
Arquivo ".../venv/bin/briefcase", linha 5, em <module>
    from briefcase.__main__ import main
Arquivo ".../venv/lib/python3.13/site-packages/briefcase/__main__.py", linha 3, em <módulo>
    from .cmdline import parse_cmdline
Arquivo ".../venv/lib/python3.13/site-packages/briefcase/cmdline.py", linha 6, em <módulo>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Arquivo ".../venv/lib/python3.13/site-packages/briefcase/commands/__init__.py", linha 1, em <módulo>
    from .build import BuildCommand  # noqa
Arquivo ".../venv/lib/python3.13/site-packages/briefcase/commands/build.py", linha 5, em <module>
    from .base import BaseCommand, full_options
Arquivo ".../venv/lib/python3.13/site-packages/briefcase/commands/base.py", linha 14, em <módulo>
    import faker
ModuleNotFoundError: Nenhum módulo chamado 'faker'
(beeware-venv) C:\...>briefcase dev
Traceback (última chamada mais recente):
Arquivo "...\venv\bin\briefcase", linha 5, em <module>
    from briefcase.__main__ import main
Arquivo "...\venv\lib\python3.13\site-packages\briefcase\__main__.py", linha 3, em <módulo>
    from .cmdline import parse_cmdline
Arquivo "...\venv\lib\python3.13\site-packages\briefcase\cmdline.py", linha 6, em <módulo>
    from briefcase.commands import DevCommand, NewCommand, UpgradeCommand
Arquivo "...\venv\lib\python3.13\site-packages\briefcase\commands\__init__.py", linha 1, em <módulo>
    from .build import BuildCommand  # noqa
Arquivo "...\venv\lib\python3.13\site-packages\briefcase\commands\build.py", linha 5, em <module>
    from .base import BaseCommand, full_options
Arquivo "...\venv\lib\python3.13\site-packages\briefcase\commands\base.py", linha 14, em <módulo>
    import faker
ModuleNotFoundError: Nenhum módulo chamado 'faker'

Não é possível executar um aplicação Android no modo de desenvolvedor - use as instruções para a plataforma de desktop escolhida.

Não é possível executar um aplicação iOS no modo de desenvolvedor - use as instruções para a plataforma de desktop escolhida.

O que aconteceu? Adicionamos faker ao nosso código, mas não o adicionamos ao ambiente virtual usado para executar a aplicação no modo de desenvolvimento.

Quando o Briefcase executa um aplicação no modo de desenvolvimento, ele cria um ambiente virtual independente para esse aplicação, independente do ambiente em que você executa briefcase. Se o sua aplicação não declarar que precisa de uma biblioteca específica, essa biblioteca não será instalada no ambiente virtual de desenvolvimento.

Então, como você adiciona um novo requisito ao sua aplicação?

Atualização de dependências

No diretório raiz do sua aplicação, há um ficheiro chamado pyproject.toml. Esse ficheiro contém todos os detalhes de configuração da aplicação que você forneceu quando executou originalmente o briefcase new.

o pyproject.toml é dividido em seções; uma das seções descreve as configurações do sua aplicação:

[tool.briefcase.app.helloworld]
formal_name = "Hello World"
description = "Um aplicação tutorial"
long_description = """Mais detalhes sobre a aplicação devem ser inseridos aqui.
"""
sources = ["src/helloworld"]
requires = []

A opção requires descreve as dependências da nossa aplicação. É uma lista de strings que especifica as bibliotecas (e, opcionalmente, as versões das bibliotecas) que você deseja incluir na sua aplicação.

Modifique a configuração requires para que fique assim:

requires = [
    "faker",
]

Ao adicionar essa configuração, estamos dizendo ao Briefcase "quando você compilar meu aplicação, execute pip install httpx no pacote de aplicações". Qualquer coisa que seja uma entrada legal para pip install pode ser usada aqui - portanto, você poderia especificar:

  • Uma versão específica da biblioteca (por exemplo, "httpx==0.19.0");
  • Um intervalo de versões de biblioteca (por exemplo, "httpx>=0.19");
  • Um caminho para um repositório git (por exemplo, "git+https://github.com/encode/httpx"); ou
  • Um caminho de ficheiro local (no entanto, esteja avisado: se você fornecer seu código a outra pessoa, esse caminho provavelmente não existirá no computador dela!)

Mais abaixo no pyproject.toml, você notará outras seções que dependem do sistema operativo, como [tool.briefcase.app.helloworld.macOS] e [tool.briefcase.app.helloworld.windows]. Essas seções também têm uma configuração requires. Essas configurações permitem definir dependências adicionais específicas da plataforma. Assim, por exemplo, se você precisar de uma biblioteca específica da plataforma para lidar com algum aspecto do sua aplicação, poderá especificar essa biblioteca na secção requires específica da plataforma, e essa configuração será usada somente para essa plataforma. Você notará que as bibliotecas toga são todas especificadas na secção requires específica da plataforma - isso ocorre porque as bibliotecas necessárias para exibir uma interface de utilizador são específicas da plataforma.

No nosso caso, queremos que o httpx seja instalado em todas as plataformas, portanto, usamos a configuração requires em nível de aplicação. As dependências no nível da aplicação sempre serão instaladas; as dependências específicas da plataforma são instaladas além das dependências no nível da aplicação.

Depois de adicionar o novo requisito, salve pyproject.toml e execute briefcase dev -r. O sinalizador -r informa ao Briefcase que os requisitos foram alterados e que o ambiente virtual de desenvolvimento precisa ser atualizado:

(beeware-venv) $ briefcase dev -r

[helloworld] Ativando o ambiente de desenvolvimento...
...
Recriando o ambiente virtual (dev.cpython-313-darwin)... concluído

[hello-world] A instalar os pré-requisitos...
...

[helloworld] A iniciar no modo de desenvolvimento...
===========================================================================

Ao inserir um nome e pressionar o botão, você verá uma caixa de diálogo semelhante:

Caixa de diálogo do Tutorial 7 do Hello World, no
macOS

(beeware-venv) $ briefcase dev -r

[helloworld] Ativando o ambiente de desenvolvimento...
...
Recriando ambiente virtual (dev.cpython-313-x86_64-linux-gnu)... concluído

[hello-world] A instalar pré-requisitos...
...

[helloworld] A iniciar no modo dev...
===========================================================================

Ao inserir um nome e pressionar o botão, você verá uma caixa de diálogo semelhante:

Caixa de diálogo do Tutorial 7 do Hello World, no
Linux

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

[helloworld] Ativando o ambiente de desenvolvimento...
...
Recriando ambiente virtual (dev.cp313-win_amd64)... concluído

[hello-world] A instalar pré-requisitos...
...

[helloworld] A iniciar no modo dev...
===========================================================================

Ao inserir um nome e pressionar o botão, você verá uma caixa de diálogo semelhante:

Caixa de diálogo Hello World Tutorial 7, no
Windows

Não é possível executar um aplicação Android no modo de desenvolvedor - use as instruções para a plataforma de desktop escolhida.

Não é possível executar um aplicação iOS no modo de desenvolvedor - use as instruções para a plataforma de desktop escolhida.

Possíveis erros ao executar briefcase dev

Se você ainda estiver recebendo um erro ao executar briefcase dev, certifique-se de que:

  1. Você adicionou faker à lista requires em pyproject.toml;
  2. Você salvou suas alterações em pyproject.toml; e
  3. Você incluiu o argumento -r ao executar briefcase dev -r.

Na primeira vez que você executa sua aplicação usando briefcase dev, o argumento -r é adicionado automaticamente para você — é por isso que não precisamos usar o argumento -r até agora. O argumento -r só é necessário quando você adiciona, remove ou altera um requisito depois de executar sua aplicação no modo de desenvolvimento. Se você apenas atualizou o código, pode executar briefcase dev como temos feito no restante deste tutorial.

A executar a aplicação atualizado

Agora temos um aplicação funcional, usando uma biblioteca de terceiros, rodando em modo de desenvolvimento. Vamos empacotar esse código de aplicação atualizado como um aplicação independente. Como fizemos alterações no código, precisamos seguir as mesmas etapas do Tutorial 4:

Atualize o código na aplicação empacotado:

(beeware-venv) $ briefcase update

[helloworld] A atualizar o código da aplicação...
...

[helloworld] Aplicação atualizado.

Reconstrua a aplicação:

(beeware-venv) $ briefcase build

[helloworld] Aplicação de assinatura ad hoc...
[helloworld] Compilado: build/helloworld/macos/app/Hello World.app

E, por fim, execute a aplicação:

(beeware-venv) $ briefcase run

[helloworld] A iniciar a aplicação...
===========================================================================

No entanto, quando a aplicação for executado, você verá um erro no console, além de uma caixa de diálogo de falha:

Falha da aplicação Hello World Tutorial 7, no
macOS

Atualize o código na aplicação empacotado:

(beeware-venv) $ briefcase update

[helloworld] A atualizar o código da aplicação...
...

[helloworld] Aplicação atualizado.

Reconstrua a aplicação:

(beeware-venv) $ briefcase build

[helloworld] A finalizar a configuração da aplicação...
...

[helloworld] A compilar a aplicação...
...

[helloworld] Compilado em build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr/bin/helloworld

E, por fim, execute a aplicação:

(beeware-venv) $ briefcase run

[helloworld] A iniciar a aplicação...
===========================================================================

No entanto, quando a aplicação for executado, você verá um erro no console:

Traceback (última chamada mais recente):
  Arquivo "/usr/lib/python3.13/runpy.py", linha 194, em _run_module_as_main
    return _run_code(code, main_globals, None,
  Arquivo "/usr/lib/python3.13/runpy.py", linha 87, em _run_code
    exec(code, run_globals)
  Arquivo "/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/helloworld-0.0.1/usr/app/hello_world/__main__.py", linha 1, em <module>
    from helloworld.app import main
  Arquivo "/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/helloworld-0.0.1/usr/app/hello_world/app.py", linha 8, em <module>
    import faker
ModuleNotFoundError: Nenhum módulo chamado 'faker'

Não foi possível iniciar a aplicação helloworld.

Atualize o código na aplicação empacotado:

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

[helloworld] A atualizar o código da aplicação...
...

[helloworld] Aplicação atualizado.

Reconstrua a aplicação:

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

[helloworld] Compilado em build\helloworld\windows\app\src\Toga Test.exe

E, por fim, execute a aplicação:

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

[helloworld] A iniciar a aplicação...
===========================================================================

No entanto, quando a aplicação for executado, você verá um erro no console, além de uma caixa de diálogo de falha:

Falha na aplicação Hello World Tutorial 7, no
Windows

Atualize o código na aplicação empacotado:

(beeware-venv) $ briefcase update android

[helloworld] A atualizar o código da aplicação...
...

[helloworld] Aplicação atualizado.

Reconstrua a aplicação:

(beeware-venv) $ briefcase build android

[helloworld] A atualizar metadados da aplicação...
...
[helloworld] Compilado em build/helloworld/android/gradle/app/build/outputs/apk/debug/app-debug.apk

E, por fim, execute a aplicação (selecionando um simulador quando solicitado):

(beeware-venv) $ briefcase run android

[helloworld] A seguir, a saída do relatório do dispositivo (digite CTRL-C para interromper o relatório)...
===========================================================================

No entanto, quando a aplicação for executado, você verá um erro no console:

--------- início da falha
E/AndroidRuntime: EXCEÇÃO FATAL: main
E/AndroidRuntime: Processo: com.example.helloworld, PID: 8289
E/AndroidRuntime: java.lang.RuntimeException: Não foi possível iniciar a atividade ComponentInfo{com.example.helloworld/org.beeware.android.MainActivity}: com.chaquo.python.PyException: ModuleNotFoundError: Nenhum módulo chamado 'faker'
E/AndroidRuntime:   em android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
E/AndroidRuntime:   em android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
E/AndroidRuntime:   em android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
E/AndroidRuntime:   em android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
E/AndroidRuntime:   em android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
E/AndroidRuntime:   em android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
E/AndroidRuntime:   em android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime:   em android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime:   em android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime:   em android.app.ActivityThread.main(ActivityThread.java:7839)
E/AndroidRuntime:   em java.lang.reflect.Method.invoke(Método Nativo)
E/AndroidRuntime:   em com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/AndroidRuntime:   em com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
E/AndroidRuntime: Causado por: com.chaquo.python.PyException: ModuleNotFoundError: Nenhum módulo chamado 'faker'
E/AndroidRuntime:   em <python>.helloworld.app.<module>(app.py:8)
E/AndroidRuntime:   em <python>.java.chaquopy.import_override(import.pxi:60)
E/AndroidRuntime:   em <python>.__main__.<module>(__main__.py:1)
E/AndroidRuntime:   em <python>.runpy._run_code(<frozen runpy>:88)
E/AndroidRuntime:   em <python>.runpy._run_module_code(<frozen runpy>:98)
E/AndroidRuntime:   em <python>.runpy.run_module(<frozen runpy>:226)
E/AndroidRuntime:   em <python>.chaquopy_java.call(chaquopy_java.pyx:352)
E/AndroidRuntime:   em <python>.chaquopy_java.Java_com_chaquo_python_PyObject_callAttrThrowsNative(chaquopy_java.pyx:324)
E/AndroidRuntime:   em com.chaquo.python.PyObject.callAttrThrowsNative(Método Nativo)
E/AndroidRuntime:   em com.chaquo.python.PyObject.callAttrThrows(PyObject.java:232)
E/AndroidRuntime:   em com.chaquo.python.PyObject.callAttr(PyObject.java:221)
E/AndroidRuntime:   em org.beeware.android.MainActivity.onCreate(MainActivity.java:85)
E/AndroidRuntime:   em android.app.Activity.performCreate(Activity.java:8051)
E/AndroidRuntime:   em android.app.Activity.performCreate(Activity.java:8031)
E/AndroidRuntime:   em android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
E/AndroidRuntime:   em android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
E/AndroidRuntime:   ... mais 12
I/Process : Enviando sinal. PID: 8289 SIG: 9

Atualize o código na aplicação empacotado:

(beeware-venv) $ briefcase update iOS

[helloworld] A atualizar o código da aplicação...
...

[helloworld] Aplicação atualizado.

Reconstrua a aplicação:

(beeware-venv) $ briefcase build iOS

[helloworld] A atualizar os metadados da aplicação...
...
[helloworld] Compilado: build/helloworld/ios/xcode/build/Debug-iphonesimulator/Hello World.app

E, por fim, execute a aplicação (selecionando um simulador quando solicitado):

(beeware-venv) $ briefcase run iOS

...
[helloworld] A seguir, a saída do relatório do simulador (digite CTRL-C para interromper o relatório)...
===========================================================================

No entanto, quando a aplicação for executado, você verá um erro no console:

O aplicação travou!
========================
Traceback (última chamada mais recente):
  Arquivo "/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", linha 1, em <módulo>
    from helloworld.app import main
  Arquivo "/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", linha 8, no <módulo>
    import faker
ModuleNotFoundError: Nenhum módulo chamado 'faker'

Mais uma vez, a aplicação não foi iniciado porque o faker não foi instalado - mas por quê? Já não instalamos o faker?

Temos, mas apenas no ambiente de desenvolvimento. Cada aplicação criado também tem seu próprio ambiente independente, que é uma das coisas que o Briefcase produz quando você executa briefcase build. Quando executamos briefcase dev -r, adicionamos faker ao nosso ambiente de desenvolvimento, mas não aa aplicação empacotado. Também precisamos executar briefcase update -r para que o Briefcase saiba que os requisitos da aplicação empacotado foram alterados:

(beeware-venv) $ briefcase update -r

[helloworld] A atualizar o código da aplicação...
A instalar src/hello_world...

[helloworld] A atualizar os requisitos...
Coletando faker
  A usar faker-37.3.0-py3-none-any.whl.metadata em cache (15 kB)
...
A instalar pacotes recolhidos: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Instalado com sucesso: 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] A remover conteúdo desnecessário da aplicação...
...

[helloworld] Aplicação atualizado.
(beeware-venv) $ briefcase update -r

[helloworld] A finalizar a configuração da aplicação...
A direcionar para ubuntu:jammy (base do fornecedor: debian)
A determinar a versão do glibc... concluído
A direcionar para glibc 2.35
A direcionar para Python 3.13

[helloworld] A atualizar o código da aplicação...
A instalar src/hello_world...

[helloworld] A atualizar os requisitos...
A recolher faker
  A usar faker-37.3.0-py3-none-any.whl.metadata em cache (15 kB)
...
A instalar pacotes recolhidos: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Instalado com sucesso: 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] A remover conteúdo desnecessário da aplicação...
...

[helloworld] Aplicação atualizada.
(beeware-venv) C:\...>briefcase update -r

[helloworld] A atualizar o código da aplicação...
A instalar src/helloworld...

[helloworld] A atualizar os requisitos...
Coletando faker
  A usar faker-37.3.0-py3-none-any.whl.metadata em cache (15 kB)
...
A instalar pacotes recolhidos: tzdata, travertino, std-nslog, rubicon-objc, fonttools, toga-core, faker, toga-cocoa
Instalado com sucesso: 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] A remover conteúdo desnecessário da aplicação...
...

[helloworld] Aplicação atualizado.
(beeware-venv) $ briefcase update android -r

[helloworld] A atualizar o código da aplicação...
A instalar src/helloworld... concluído

[helloworld] A atualizar os requisitos...
A gravar ficheiro de requisitos... concluído

[helloworld] A remover conteúdo desnecessário da aplicação...
A remover conteúdo desnecessário do pacote da aplicação... concluído

[helloworld] Aplicação atualizado.
(beeware-venv) $ briefcase update iOS -r

[helloworld] A atualizar o código da aplicação...
A instalar src/helloworld... concluído

[helloworld] A atualizar os requisitos...
Pesquisando nos índices: https://pypi.org/simple, https://pypi.anaconda.org/beeware/simple
Recolhendo o faker
  A usar o faker-37.4.0-py3-none-any.whl.metadata em cache (15 kB)
...

A instalar os requisitos da aplicação para o simulador do iPhone... concluído

[helloworld] A remover conteúdo desnecessário da aplicação...
A remover conteúdo desnecessário do pacote da aplicação... concluído

[helloworld] Aplicação atualizado.

Depois de atualizar, você pode executar briefcase build e briefcase run e verá a aplicação empacotado com o novo comportamento de diálogo.

Nota

A opção -r para atualizar os requisitos também é aceita pelos comandos build e run, portanto, se quiser atualizar, compilar e executar em uma única etapa, você pode usar briefcase run -u -r.

Pacotes Python de terceiros para dispositivos móveis e Web

O Faker é apenas um exemplo de um pacote Python de terceiros - uma coleção de código que não faz parte do que o Python fornece de fábrica. Esses pacotes de terceiros são mais comumente distribuídos usando o Python Package Index (PyPI) e instalados em seu ambiente virtual local. Neste tutorial, usamos o pip, mas há outras opções.

Em plataformas desktop (macOS, Windows, Linux), basicamente qualquer pacote no PyPI pode ser instalado em seu ambiente virtual ou adicionado aos requisitos do sua aplicação. No entanto, ao criar um aplicação para plataformas móveis ou web, suas opções são um pouco limitadas.

Em resumo, qualquer pacote puro Python (ou seja, qualquer pacote criado a partir de um projeto escrito somente em Python) pode ser usado sem dificuldade. Alguns pacotes, entretanto, são criados a partir de projetos que contêm Python e outras linguagens (por exemplo, C, C++, Rust etc.). O código escrito nessas linguagens precisa ser compilado em módulos binários específicos da plataforma antes de poder ser usado, e esses módulos binários pré-compilados só estão disponíveis em plataformas específicas. As plataformas móveis e da Web têm requisitos muito diferentes das plataformas de desktop "padrão". No momento, a maioria dos pacotes Python não fornece binários pré-compilados para plataformas móveis e da Web.

No PyPI, os pacotes geralmente são fornecidos em um formato de distribuição pré-construído chamado wheels. Para verificar se um pacote é Python puro, dê uma olhada na página de downloads do projeto no PyPI. Se as rodas fornecidas tiverem um sufixo -py3-none-any.whl (por exemplo, Faker), então elas são rodas Python puras. No entanto, se as rodas tiverem extensões específicas de versão e plataforma (por exemplo, Pillow, que tem rodas com sufixos como -cp313-cp313-macosx_11_0_arm64.whl e -cp39-cp39-win_amd64.whl), então a roda contém um componente binário. Esse pacote não pode ser instalado em plataformas móveis ou da Web, a menos que uma roda compatível com essas plataformas tenha sido fornecida.

No momento, a maioria dos pacotes binários no PyPI não fornece rodas compatíveis com dispositivos móveis ou com a Web. Para preencher essa lacuna, o BeeWare fornece binários para alguns módulos binários populares (incluindo numpy, pandas e cryptography). Essas rodas não são distribuídas no PyPI, mas o Briefcase instalará essas rodas se elas estiverem disponíveis.

O BeeWare pode fornecer binários para alguns módulos binários populares (incluindo numpy, pandas e cryptography). Normalmente, é possível compilar pacotes para plataformas móveis, mas isso não é fácil de configurar, o que está fora do escopo de um tutorial introdutório como este.

Próximos passos

Agora temos um aplicação que usa uma biblioteca de terceiros! No Tutorial 8, aprenderemos como garantir que nossa aplicação permaneça responsivo à medida que adicionarmos uma lógica de aplicação mais complexa.