ScriptsGuia

Dependências

Não há arquivo de requirements para manter. O Waiso lê os imports do código, descobre o pacote de cada um e instala no worker antes de o main rodar. Em Python dá para fixar uma versão, acrescentar um pacote que o código carrega pelo nome ou trocar o pacote de um import no painel Dependências — e publicar congela as versões exatas, então um lançamento novo do pacote nunca muda um script publicado.

9 min de leituraAntes: Escrevendo códigoAbrir no Waiso
O que você vai aprender
  • Ver como um import Python vira um pacote do PyPI (yaml → PyYAML)
  • Fixar, acrescentar e trocar pacotes no painel Dependências
  • Saber o que a publicação trava e como atualizar
  • Entender os quatro erros de instalação e corrigi-los

Os imports são a lista de dependências

Cada linguagem é lida do seu jeito. Os imports de Python são lidos com o próprio parser do Python em qualquer profundidade — dentro de funções, blocos try e condicionais também — e a biblioteca padrão e os scripts do seu projeto ficam de fora. Os imports de TypeScript e JavaScript (import … from, import(), require()) são instalados com o Bun. C e C++ não instalam nada: usam os headers do sistema que vêm no worker.

report.py
1import yaml2import requests3 4def main(title: str = "Daily report"):5    rows = requests.get(API_URL).json()6    return {"title": title, "yaml": yaml.safe_dump(rows)}
Python 3.15LSP
3Dependências2
yamlPyYAML
detectadofixado6.0.3linha 1
requestsrequests
declaradofixado2.32.3linha 2
Adicionar pacoteAtualizar dependências
As versões são fixadas ao publicar. Atualizar dependências resolve de novo para a próxima publicação.
Cada import com o pacote e de onde ele veio: detectado, declarado, comentário ou fixado.
read_config.py
import yaml  # installs the PyPI package PyYAML


def main(config: str = "name: nightly\nretries: 3\n"):
    data = yaml.safe_load(config)
    return {"name": data["name"], "retries": data["retries"]}
Saída esperadaSucessoO mesmo resultado nas três; a primeira execução instala o pacote, as seguintes reaproveitam o cache
{
  "name": "nightly",
  "retries": 3
}

A primeira execução de um conjunto novo de pacotes mostra a instalação em Logs; depois o worker reaproveita o cache e a execução começa na hora. Um import que não está no código não é instalado — não há nada a declarar para pacotes que o código já importa.

Python: do import ao pacote

Muitos pacotes são importados por um nome diferente do nome que se instala. O Waiso mantém um mapa deles — cerca de 150 entradas, vale o caminho de módulo mais longo que bater — e o que não está no mapa é tentado pelo próprio nome.

Você escreveO Waiso instala
import yamlPyYAML
from PIL import ImagePillow
from bs4 import BeautifulSoupbeautifulsoup4
import cv2opencv-python-headless
from sklearn import …scikit-learn
from dateutil import parserpython-dateutil
import jwtPyJWT
from google.cloud import storagegoogle-cloud-storage (por regra)
thumbnail.py
def main(width: int = 64, height: int = 64):
    # An import inside a function is found too: Pillow is installed.
    from PIL import Image

    img = Image.new("RGB", (width, height), "white")
    return {"size": list(img.size), "mode": img.mode}

O painel Dependências

Um script Python tem a aba Dependências no painel lateral do editor, com a contagem de pacotes. Cada linha é um import e o pacote que ele instala, com um chip: detectado (achado no código), declarado (salvo no painel), comentário (um comentário antigo) e, depois de publicar, fixado. Um import que o mapa não conhece mostra Nenhum pacote com esse nome e um botão Declarar pacote; uma execução ainda tenta instalá-lo pelo próprio nome.

  1. Fixe uma versão

    Clique em Trocar o pacote deste import numa linha detectada, digite um especificador em Versão — ==2.31.0 ou >=2,<3; vazio é a mais recente — e clique em Salvar. A linha vira declarado.

  2. Acrescente um pacote que o código não importa

    Adicionar pacote declara um pelo nome — para um plugin que uma biblioteca carrega sozinha, ou para Extras como requests[socks].

  3. Troque o pacote de um import

    Numa linha detectada, o mesmo botão deixa você indicar outro pacote para aquele import — por exemplo o opencv-python completo em vez da versão headless.

Comentários antigos

Scripts antigos podem ter comentários de linha inteira como # @requests@2.31.0. Eles ainda valem, com a versão — mas só nesse formato exato: um comentário sozinho na linha, #, @, o pacote e um @versão opcional. Quando o painel os encontra, ele avisa Há pacotes declarados em comentários do código e oferece Mover para o painel, para que fiquem salvos com o script.

Publicar trava as versões

Uma execução do rascunho resolve os pacotes — as versões mais novas que as declarações permitem — e registra o que instalou. Publicar congela essa resolução como o lock do script: cada pacote, inclusive os que vieram puxados por outros, com a versão exata. A versão publicada passa a instalar sempre exatamente ==versão de cada um, sem resolver de novo, então agendamentos, a API e os flows continuam rodando o que você testou.

Para pegar versões mais novas, clique em Atualizar dependências no rodapé do painel: a próxima execução do rascunho resolve de novo, e a próxima publicação congela isso. Até lá a versão publicada mantém o lock.

TypeScript e JavaScript

Todo pacote que um import nomeia é instalado com bun install quando o script roda — a versão latest, na primeira vez que um certo código roda num worker; o mesmo código reaproveita essa instalação depois. Pacotes com escopo (@scope/pkg) funcionam; um subcaminho (lodash/fp) instala o pacote base. Caminhos relativos são os scripts do seu projeto, e os módulos node: e bun: já vêm embutidos.

No editor, cada linha de import tem um indicador com o estado — instalando, instalado ou com erro — e clicar nele abre um seletor de versão. A versão escolhida vira um comentário no fim da linha, import _ from 'lodash' // @4.17.21, que define a versão que o editor instala para tipos e sugestões.

Quando uma instalação falha

Uma execução Python cujos pacotes não instalam falha antes de o main começar, com um de quatro códigos. O erro nomeia o pacote — e o import e a linha que o pediram — e as linhas do próprio pip ficam em Logs. Quando a instalação do próprio editor falha, a aba Problemas também mostra isso na linha do import.

CódigoSignificadoCorreção
dependency_not_foundNenhum pacote com esse nome no índice — em geral um import cujo nome de instalação é outroIndique o pacote certo para o import no painel
dependency_version_not_foundO pacote existe, mas nenhuma versão atende o especificador, ou dois requisitos conflitamAfrouxe ou corrija a versão
dependency_index_unreachableO worker não alcançou o índice de pacotesExecute de novo; se repetir, fale com o administrador
dependency_build_failedO pip achou o pacote mas não conseguiu compilar ou instalarEscolha uma versão que tenha wheel
Saída esperadaSucessoUm erro de digitação num import: <code>dependency_not_found</code>, antes de qualquer código seu rodar
Could not install the package for `import sklern` (tried `sklern`). Declare the package explicitly: open Dependencies and add the package that provides `sklern`

Limites

  • Scripts não têm acesso à rede; só a etapa de pacotes do worker alcança o índice, e um administrador pode bloquear ou restringir nomes de pacotes.
  • Um import TypeScript só de efeito, sem nada importado (import 'pkg'), não é instalado — importe algo dele.
  • O painel Dependências e o lock são só de Python; C e C++ não instalam pacotes.
  • No máximo 100 declarações por script.